文字列を扱うには、String クラスがありますが、String クラスでは、いったん作成したオブジェクトの内容を変更することが出来ません。そこで、文字列中の文字を変更するために StringBuffur クラス を使うと文字列中の内容を変更できることが出来ます。
以下が StringBuffer クラスの主なメソッドの一部の例です。
class Test{ public static void main(String args[]){
StringBuffer sb1=new StringBuffer("TestCase"); StringBuffer sb2=new StringBuffer("TestCase2"); System.out.println(sb1); System.out.println(sb2); //append()メソッドを使っての文字列の変更 System.out.println(sb1.append("+are you happay?+")); System.out.println(sb1.append(sb2)); //insert()メソッドを使っての文字列の変更 System.out.println(sb1.insert(2, '-')); } }
実行結果になります。
TestCase
TestCase2 TestCase +are you happay?+ TestCase +are you happay?+TestCase2 Te-stCase +are you happay?+TestCase2
append () メソッドでは、文字列の最後に追加しています。一方、insert () メソッドでは、文字列の 2番目に「-」の文字を追加しています。java では文字列を数えるときには「0」番目から数えるので、2番目の「s」の文字の前に「-」が追加されています。
文字列バッファは、バイナリ文字列の連結演算子 + を実装するためにコンパイラで使用されます。
stringTest = "abcd" + "efgh" + "ijkl" ;
上記のコードは、以下の同等なコードとしてコンパイルされます。
stringTest = new StringBuffer().append("abcde").append(" efgh ").append("ijkl").toString();
上記のコードを見てわかるように、「+」 演算子で文字列を連結するとそのたびに新しい StringBuffer を new しています。
ループをまわして動的に大量の文字列を生成を行うと、パフォーマンスに若干の影響が出てきます。
コンパイル後のコードの各行の最初と最後を見てみると、new と toString が記述されています。つまり「=」で変数に格納するとき StringBuffer
と String のインスタンスをそれぞれ一つずつ生成していることになります。
「+」演算子を使った文字列の連結というものにはさまざまなリスクを伴うので、文字列を直接操作する場合は StringBuffer を使用することが推奨されています。
文字列を連結するには String クラスと StringBuffer クラスがありますが、文字列の連結処理の効率が良いのは、StringBuffer
クラスになります。
StringBuffer クラスの実装では、保持されている内部バッファに 1 文字が追加されます。StringBuffer の場合、新たなオブジェクトが生成されるのは、バッファが一杯になって拡張が必要になった時だけになります。しかし、そのような状況はめったに起こりません。一方、String
クラスは、複数のオブジェクトが生成されることになります。余計なオブジェクトを生成してしまうということは Java プログラムにとって深刻な問題になります。