*目次 [#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言語入門 シニア編』