このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

目次

StringBuffer型オブジェクトの初期化

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

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

例:

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

StringBufferオブジェクトのサイズ

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

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

例:

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 
 
-
|
-
|
|
|
|
!
|
!
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クラス

 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は直接内容書き換わっている。

データ変換

char配列,byte配列→String型

 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配列

 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型

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型

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

参考文献

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