文字列結合する場合は、StringBuilderを使おうねというお話。

JDK1.5からStringBullderってのが出来たので、そっちを使ったほうが高速みたいです。
使い方はStringBufferと一緒。

Stringの「+演算子」を使った文字列の結合は、実質的にStringBuffer#append()(JDK1.5以降ではStringBuilder)が使われている。
なので、文字列の結合が多いような処理でStringのまま結合すると、毎回StringBuilderが作られてしまう。

さらに、StringBuilderは(StringBufferも)、コンストラクターで容量を指定しない場合、初期容量は16文字分になっている。
appendした際に容量を超えると拡張されて その分効率が落ちてしまうので、容量が多いことが分かっているのであれば、コンストラクターでサイズ(capacity)を指定した方が良い。

以下が計測したソースと結果(マシン数ペックによるけど)

結果

String : 10966806675
StringBuffer : 5258490
StringBuilder : 1007111
StringBuilder2 : 448940

ソース

String str = "";
long strStart = java.lang.System.nanoTime();
for (int i = 0; i < 10000; i++) {
    str += "Hello world";
}
long strEnd = java.lang.System.nanoTime();
System.out.println("String         : " + (strEnd - strStart));


StringBuffer buffer = new StringBuffer();
long bufferStart = java.lang.System.nanoTime();
for (int i = 0; i < 10000; i++) {
    buffer.append("Hello world");
}
long bufferEnd = java.lang.System.nanoTime();
System.out.println("StringBuffer   : " + (bufferEnd - bufferStart));


StringBuilder builder = new StringBuilder();
long builderStart = java.lang.System.nanoTime();
for (int i = 0; i < 10000; i++) {
    builder.append("Hello world");
}
long builderEnd = java.lang.System.nanoTime();
System.out.println("StringBuilder  : " + (builderEnd - builderStart));


StringBuilder builder2 = new StringBuilder(10000*16);
long builderStart2 = java.lang.System.nanoTime();
for (int i = 0; i < 10000; i++) {
    builder2.append("Hello world");
}
long builderEnd2 = java.lang.System.nanoTime();
System.out.println("StringBuilder2 : " + (builderEnd2 - builderStart2));

※ ナノ秒まで計測しているけど特に理由はないです

結果は見ての通り。

とりあえず、Stringの「+演算子」を使った文字列の結合やめてStringBuilderを使おうよってことで。
※スレッドの時は注意して。