初心者向けのJava講座です。一緒にJavaを勉強しませんか?
はじめてのJava入門初心者向けのJava講座 |
StringBufferクラスのコンストラクタ
StringBufferクラスには主に以下の3つのコンストラクタが用意されています。
StringBufferクラスの主なコンストラクタ
コンストラクタ |
説明 |
StringBuffer() | 空のオブジェクトを生成する。 ただし、後の文字列の追加に備えて16文字分のメモリ領域を伴う |
StringBuffer(int i) | 空のオブジェクトを生成する。 生成時のメモリ量は引数のiの文字数分が取られる |
StringBuffer(String str) | 引数も文字列を管理するオブジェクトを生成する。メモリ量は文字列の文字数+16文字分のメモリ領域が取られる。 |
そしてあらかじめ文字列を扱う領域として、16文字分のメモリ領域を確保します。
次のStringBuffer(int i)は何文字分の領域をあらかじめ確保しておくかを指定することができます
つまり、引数に指定された文字列分だけ格納するための領域を確保して、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()メソッドはこのオブジェクトが今現在確保しているメモリの有効文字数です。
つまり今現在管理している文字列がないので文字列の長さは0になりますが、
このコンストラクタは最初から後々文字列の追加に備えて16文字分のメモリを確保されています。
したがってcapacity()は16になります。
次のStringBuffer(int i)コンストラクタも今現在文字列は管理されていません。
したがって、文字列の長さは0になります。
しかし、このコンストラクタは引数にメモリ領域を何文字分確保するかを指定してやることができます。
今回の場合は4文字分の確保を指定されています。
したがって、capacity()は4になります。
したがって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が違うのがわかります。
では、このような場合はどうでしょうか?
サンプルプログラム(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オブジェクトを生成し、
参照の付け替えを自動的に行ってくれるのです