argius note

プログラミング関連

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));