ほげにっき

hogedigoの日記

文字列の連結について

某氏日記で「Tiger(J2SE5)からは文字列の+演算子連結はStringBuilder連結に置き換わる為、従来から言われている『+演算子よりもStringBufferの方が高速』というのは間違い」と言うのを読んだ。※あまりに前の日記なのでトラックバックはしない

StringBuilderはStringBufferと違ってsynchronizedされてないので、高速・・・というのはたしかに正しいんだけど、従来問題になっていたのは、+=演算子などのケースだったよね?

String str = "hoge";
for (int i = 0; i < 99999999; i++) {
str += Integer.toString(i);
// str = str + Integer.toString(i);も同じ
}

とか。これだと連結の度に、

str = new StringBuilder(str).append(Integer.toString(i)).toString();

と同等の処理がされるので、ループ回数のStringBuilderとStringの生成分遅くなります。

こういう場合は、従来どおりStringBuffer一個作って連結してった方が高速でしょう。もちろんTiger前提の話なのでStringBuilderを使うべきでしょう。

結局言いたいのは、TigerになってもStringBuffer使うべきだったところがStringBuilderになったと言うだけで、方法論はあまり変わっていない、と。単純に「Tigerになったら+演算子使っていいんだよ」て聞こえたので、え?と思ったわけです。

もちろん最近のPCは高速だし、コンパイラやVMの最適化もこなれてきたので、大抵のケースであまり問題になる程のことはありません。僕もそれほど大きなループでなければ、+演算子や+=演算子を使用してます。読みやすいしね。