internの話
元ネタはブクマ参照。
少なくとも、Java6でコンパイラしたものをJava7で動かしても同様なので、コンパイラの話ではないと思います。
internのpool実装がJava7で変わったらしく、これまではPermGenだったのが、Java7では普通のheapに置くようになったとか。
でも、これはあまり関係なさそう。
結局、明確にこれって答えは出せていませんが、Java7では文字列リテラルに対してメソッドを実行したときにinternされるようになったみたいです。(ldc命令でinternが発動するようになったという噂も。)
以下はサンプルコードのアレンジバージョンです。
これの行を入れ替えたりして、あとはIDEのデバッグモードでオブジェクトのIDを追いかけてみると分かりやすいと思います。
String s1; s1 = "AB"; // "AB"はinternされs1に String s2 = "A"; s2 = s2 + "B"; // s2の"AB"はinternされていない String s3 = s2.intern(); // "AB"はinternされs3に "AB".trim(); // Java7では"AB"はinternされる Java6ではされない s1 = "AB"; // "AB"はintern済でs1に System.out.println("(s1 == s2) = " + (s1 == s2)); System.out.println("(s1 == s3) = " + (s1 == s3));