HOME> Javaアプリケーション講座>java.langパッケージ>StringBufferクラスのコンストラクタ

StringBufferクラスのコンストラクタ

StringBufferクラスには主に以下の3つのコンストラクタが用意されています。

StringBufferクラスの主なコンストラクタ

コンストラクタ
説明
StringBuffer() 空のオブジェクトを生成する。 ただし、後の文字列の追加に備えて16文字分のメモリ領域を伴う
StringBuffer(int i) 空のオブジェクトを生成する。 生成時のメモリ量は引数のiの文字数分が取られる
StringBuffer(String str) 引数も文字列を管理するオブジェクトを生成する。メモリ量は文字列の文字数+16文字分のメモリ領域が取られる。

まず、StringBuffer()は文字列を格納しない空のStringBufferオブジェクトを生成します。
そしてあらかじめ文字列を扱う領域として、16文字分のメモリ領域を確保します。

次のStringBuffer(int i)は何文字分の領域をあらかじめ確保しておくかを指定することができます
つまり、引数に指定された文字列分だけ格納するための領域を確保して、StringBufferオブジェクトを生成します。

次のStringBuffer(String str)は引数に文字列を受け取り、この文字列格納したStringBufferオブジェクトを生成します。 
確保する領域は格納した文字列数、プラス16文字です。

しかし、文字列を格納する領域を指定していますが、
プログラムの処理でこれ以上の文字数を格納する場合は自動的に領域がひろげられます。

では、サンプルプログラムで見ていきます。

サンプルプログラム(Sample75.java)

class Sample75{
    public static void main(String args[]){
StringBuffer sb = new StringBuffer(); StringBuffer sb1 = new StringBuffer(4); StringBuffer sb2 = new StringBuffer("Hello"); System.out.println("StringBuffer()コンストラクタ"); System.out.println("length : " + sb.length()); System.out.println("capacity : " + sb.capacity()); System.out.println("------------------------"); System.out.println("StringBuffer(int i)コンストラクタ"); System.out.println("length : " + sb1.length()); System.out.println("capacity : " + sb1.capacity()); System.out.println("------------------------"); System.out.println("StringBuffer(String str)コンストラクタ"); System.out.println("length : " + sb2.length()); System.out.println("capacity : " + sb2.capacity()); } }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

今回はあえてlength()メソッドとcapacity()メソッドを使用しました。

length()メソッドがこのオブジェクトが管理している文字列の文字数に対し
capacity()メソッドはこのオブジェクトが今現在確保しているメモリの有効文字数です。

まず、最初のStringBuffer()コンストラクタは引数を取りません。
つまり今現在管理している文字列がないので文字列の長さは0になりますが、
このコンストラクタは最初から後々文字列の追加に備えて16文字分のメモリを確保されています。
したがってcapacity()は16になります。

次のStringBuffer(int i)コンストラクタも今現在文字列は管理されていません。
したがって、文字列の長さは0になります。
しかし、このコンストラクタは引数にメモリ領域を何文字分確保するかを指定してやることができます。
今回の場合は4文字分の確保を指定されています。
したがって、capacity()は4になります。

次のStringBuffer(String str)は引数に文字列Helloが入っています。
したがってlength()は5になります。
capacity()は最初から確保されている16文字分に今回の文字列の文字数5を追加した21になります。

もうひとつサンプルプログラムを見ていきます

サンプルプログラム(Sample75_1.java)

class Sample75_1{
    public static void main(String args[]){
  
    StringBuffer sb = new StringBuffer("Hello!Javaの世界");
    StringBuffer sb1 = new StringBuffer("Hello!");

   System.out.println("length : " + sb.length());
   System.out.println("capacity : " + sb.capacity());
   System.out.println("--------------------------");

   System.out.println("length : " + sb1.length());
   System.out.println("capacity : " + sb1.capacity());
 
   sb1.append("Javaの世界");
   System.out.println("length : " + sb1.length());
   System.out.println("capacity : " + sb1.capacity());

   System.out.println("--------------------------");
   System.out.println("sb : " + sb);
   System.out.println("length : " + sb.length());
   System.out.println("capacity : " + sb.capacity());
   System.out.println("sb1 : " + sb1);
   System.out.println("length : " + sb1.length());
   System.out.println("capacity : " + sb1.capacity());

    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

月額263円でPHP・MySQL対応のレンタルサーバー、ミニバード


コンパイル・実行してみます。

上記サンプルを見てください。
2つのオブジェクトを作成しています。

1つめにはHello!Javaの世界を引数に持つオブジェクト

2つめはHello!を引数にう持つオブジェクト

しかし、2つめのオブジェクトにはappendメソッドを使用してJavaの世界という文字列を追加しています。
最終的には2つのオブジェクトもHello!Javaの世界という文字列を持つことになります。
しかし2つのオブジェクトを比較してみるとcapacityが違うのがわかります。

このように、StringBufferオブジェクトは常に+16文字分を余剰メモリを持つのではなく文字列の 追加などによって減っていくのです。

では、このような場合はどうでしょうか?

サンプルプログラム(Sample75_2.java)

class Sample75_2{
    public static void main(String args[]){

    StringBuffer sb = new StringBuffer("これから");

System.out.println("length : " + sb.length()); System.out.println("capacity : " + sb.capacity()); sb.append("みなさんとJavaを"); System.out.println("length : " + sb.length()); System.out.println("capacity : " + sb.capacity()); sb.append("勉強できたらうれしいです"); System.out.println("sb : " + sb); System.out.println("length : " + sb.length()); System.out.println("capacity : " + sb.capacity());
} }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

ここでは最初のオブジェクトにappendメソッドで追加しましたが、
最終的に最初のcapacityより文字列の長さが超えてしまいました。
実はこれはエラーにはならずJavaVMが総文字数に耐えられるメモリー領域
を持つ新規StringBufferオブジェクトを生成し、
参照の付け替えを自動的に行ってくれるのです

ページのトップへ戻る