巴扎黑2017-04-18 10:08:31
JDK6 と JDK7 をそれぞれ使用して上記のコードを実行しました。結果は次のとおりです。
リーリー質問者様のおっしゃる通り、本当でも嘘でもありませんが、主に以下の2つの理由があると思います。
リーリー
str1.intern() は定数プール内のオブジェクトを返すため、ヒープ上の str1 と同じオブジェクトではありません。
そして:
リーリー
リーリー
コードの最初の部分「StringBuilder("ja").append("va")」を「StringBuilder("ja").append("va1")」に変更しました。この変更によりどのような違いが生じますか。 ? 結果は?JDK6 と JDK7 で実行した結果を見てみましょう:
リーリー
実際、これには、異なる JDK での intern() メソッドの異なる実装が関係しています。
JDK6 および以前の JDK では:
リーリー
リーリー
JDK6 と JDK7 の intern() メソッドの違いに基づいて、次の例がわかります。リーリー
JDK ごとに異なる結果が返される理由:JDK6 では、「java1」が最初に出現する文字列定数であるため、定数プールにコピーされ、intern() メソッドはオブジェクトを返します。したがって、定数プール内の str1 はヒープ上の str1 とは異なります。
JDK7 では、「java1」が最初に表示される文字列定数ですが、intern() メソッドはこのオブジェクトを参照するだけであり、定数プールに追加してもコピーされません。 JDK6 のような定数プールに新しいオブジェクトを追加するため、 intern() メソッドによって返される参照は、実際には元の str1 と同じままです。