String の + 演算 vs StringBuilder#append(String)

String は immutable なオブジェクトなので、例えば "1" + "2" というコードを書くと "1" の領域の最後に "2" がくっつくわけではなく "12" という新しいインスタンスが割り当てられる。

だが "1" + "2" + "3" と書くと、"12" という String がまずできて、それから "123" が生成され、途中の "12" は使い捨てられる、ということはない


以下のコードは:

String s = "1" + "2" + "3";

Oracle JDK だと、以下のようにコンパイルされる。

String s = new StringBuilder()
    .append("1")
    .append("2")
    .append("3").toString();

コンパイルオプションで "-source 1.4 -target 1.4" を指定すると、StringBuilder の代わりに StringBuffer が使われる。

javac がまだこうしたコンパイル時最適化を行ってくれなかった頃のノウハウを更新できていないプログラマは、わざわざ見通しの悪い append を連結しがち。処理系が Oracle かどうか、ではなくあくまでもコンパイラの問題。


見通しをもっと良くしようとして以下のように書くのは一番ダメ。

String s = "1";
s += "2";
s += "3";