> > |記事を要約すると、Stringはimmutableなのに上記のようなことが可能な
> > |のは、+による文字列の連結がコンパイル時に行われるからだ、というよ
> > |うな内容です。
> (snip)
> > 読んでみました。確かに混同しているみたいですね。

うー、探して読んでしまった。
引用すると、

 | "+"演算子を使った連結などはすべてコンパイル時に処理されます。そこで、
 |     String s = new String("Hello");
 |     s += " World";
 | のような、一見、immutableであるという前提を裏切っているような文も、
 | 実は裏切っていないのです。すなわちsの内容はコンパイル時に"Hello World"
 | になってしまいます。

これは事実ではありません。javap してみればわかること。
コンパイル時に連結されるのは、
   String s = "Hello" + " World";
などの場合です。

> > でもコンパイル時のにあの様に最適化するのは多分事実で、
> > その解釈が間違っているわけですね。
> 
> そうです。
> たぶん、『Java Report』の方は純粋に最適化の話だったんじゃないかな
> と思います。

Java Reportの内容はおそらく、

   Stirng s1 = "Foo";
   String s2 = "Foo";
   System.out.println(s1 == s2);

が true になること、そして、

   String s1 = "Hello World";
   String s2 = "Hello" + " World";
   System.out.println(s1 == s2);

も true になることを言っていたのでしょう。
(注: s1 == s2 は、Rubyでは s1.equal?(s2) のこと)

高木 浩光@電子技術総合研究所
http://www.etl.go.jp/~takagi/ (工事中)