*目次 [#t52d6e70]

#contents


*StringBuffer型オブジェクトの初期化 [#qb77aa1f]

 StringBuffer型オブジェクトを生成するために、StringBufferクラスには次の3種類のコンストラクタが用意されている。

+引数なし
--空文字列が設定されたと解釈される。
+バッファサイズを指定
--数値を指定すると、格納できる文字数(初期要領)を持つバッファが作成される。
+文字列を指定
--その文字列で初期化される。

例:

 StringBuffer strbuf1 = new StringBuffer();
 StringBuffer strbuf2 = new StringBuffer(64);
 StringBuffer strbuf3 = new StringBuffer("ABCDE");


*StringBufferオブジェクトのサイズ [#d1dbeaea]

 StringBufferオブジェクトは次の2つのタイプのサイズを持っている。

+現在格納されている文字列
--obj.length()で知ることが可能。
+格納できる文字列の容量
--実際の余裕サイズは処理系が決めてくれる(バッファ容量の事前確保)。こうすることで、メモリ再確保の処理回数を少なくしている。
--obj.capacity()で知ることが可能。

例:

#code(java){{
package hoge.hoge.com;

public class StrTest {

	public static void main(String[] args) {
		StringBuffer strbuf = new StringBuffer("ABCDE");
		
		System.out.println("現在格納されている文字列サイズ : " + strbuf.length());
		System.out.println("バッファ容量 : " + strbuf.capacity());
	}

}
}}

 実行結果は次の通り。

 現在格納されている文字列サイズ : 5
 バッファ容量 : 21

 バッファ容量のデフォルトは通常16文字なので、"ABCDE"の5文字を足した結果の21文字が表示されている。全角文字"あ"でも半角文字"A"でも、文字列サイズは1となるので注意。


*Stringクラス vs. StringBufferクラス [#q6fe4c10]

 Stringクラスで設定した文字列を変更することはできない。一方、StringBufferクラスで設定した文字列を変更することができる。この事実は各々に用意されているメソッドから明白である。

例1:Stringクラス

 String str1 = "test", str2;
 str2 = str1.concat("xxx");	//str2は"testxxx"
 str2 = str1.toUpperCase();	//str2は"TEST"

 Stringクラスでは文字列を加工して、新しいString型変数str2に設定している。よって、str1の内容は変化しない。
 もう少し厳密に言うと、メモリはstr1オブジェクト用に"test"という文字列をどこかの領域に確保する。そして、str1オブジェクトは"test"という文字列の先頭アドレスを指している。toUpperCaseメソッドが実行されると、str1が指している内容をコピーして、それを大文字化し、"TEST"は別のメモリ領域に記憶される。3行目でstr2オブジェクトは、その新たに生成された"TEST"の先頭アドレスを指す(文字列実体が渡されるわけではない)。最後にどこからも参照されていない"test"は不要と判断され、ガベージコレクタによって自動的に解放される。

例2:StringBufferクラス

 StringBuffer str1 = new StringBuffer("yyy");
 str1.append("zzz");		//str1は"yyyzzz"
 str1.setCharAt(2, '0');	//str1は"yy0zzz"

 StringBufferクラスのオブジェクトstr1は直接内容書き換わっている。


*データ変換 [#u7ff0c55]

**char配列,byte配列→String型 [#nf511c14]

 newするときに引数に渡せばよい。

例:

 char char_array[] = {'a', 'b', 'c', 'd', 'e'};
 String str1;
 str1 = new String(char_array);		//str1は"abcde"
 str1 = String.copyValueOf(char_array);	//str1は"abcde"
 str1 = new String(char_array, 0, 3);	//str1は"abc"(char_array[0]から3文字を設定)
 
 byte byte_array[] = {'A', 'B', 'C', 'D', 'E'};
 String str2;
 str2 = new String(byte_array);		//str2は"ABCDE"
 str2 = new String(byte_array, 0, 3);	//str2は"ABC"(byte_array[0]から3文字を設定)


**String型→char配列,byte配列 [#d4eea6dd]

 String型からchar配列への文字列取り出しには、StringクラスのgetCharsメソッドやtoCharArrayメソッドを使えばよい。また、String型からbyte配列への文字列取り出しには、StringクラスのgetBytesメソッドを使えばよい。

例:

 char char_array[];
 str.getChars(0, str.length(), char_array, 0);	//String型strからchar[]へ
 char_array = str.toCharArray();		//String型strからchar[]へ
 
 byte byte_array[];
 byte_array = str.getBytes();			//String型strからbyte[]へ


**String型→StringBuffer型 [#aa11431e]

 String str = "abcde";
 StringBuffer strbuf;
 strbuf = new StringBuffer(str);	//方法1
 
 //方法2
 strbuf.setLength(0);			//内容をクリア
 strbuf.append(str);			//文字列追加。
 
 //方法3
 strbuf.setLength(0);			//内容をクリア
 strbuf.insert(0, str);			//先頭に文字列挿入。

**StringBuffer型→String型 [#i4fbf61a]

 StringBuffer strbuf = "ABCDE";
 String str;
 str = strbuf.toString();		//方法1
 str = "" + strbuf;			//方法2

*参考文献 [#u2584e4f]

-『新Java言語入門 シニア編』