書き込もうとしたら、>>401が既にレスを・・
私のほうは参考程度に・・

>>400
最適化されるされない以前の話でいえば、変数のスコープが変わる
ってそのページに言及されてる
一時的な変数は必要になる直前で宣言したほうがいい
だから、
String str1;
str1 = "foo" + i;
System.out.println(str1);
という実装はよくなくて、
String str1 = "foo" + i;
System.out.println(str1);
と、したほうがいい。
String str;の時点のデフォルトコンストラクタの呼び出しが省ける。まさに使う直前の宣言。
さらに言及すれば、
System.out.println("foo" + i);
がいい。strのスコープがwhile一回分から、printlnの引数内に収まるから。

これぐらいならコンパイラが最適化してくれるから関係ないって意見はあるかもしれないけど、
ポリシーは一貫しておいたほうが全体的なコードは綺麗になるし、コンパイラも万能じゃないから、最適化されないケースがあるかもしれない。
そんなことにいちいち左右されたくないでしょ。
もちろん、デバッグ効率を考えて、String strを生成するってのも一つの手。
何を優先させるかってのはポリシーの問題。


文字列の結合がStringBuilderに最適化されるのは本当
嘘だと思うなら、.classファイルを逆コンパイルしてごらん
ただし、文字列リテラルはその限りではないよ。