欢迎选择我的课程,让我们一起见证您的进步~~
JDK6 と JDK7 をそれぞれ使用して上記のコードを実行しました。結果は次のとおりです。
質問者様のおっしゃる通り、本当でも嘘でもありませんが、主に以下の2つの理由があると思います。
リーリー
そして: リーリー
JDK6 と JDK7 で実行した結果を見てみましょう: リーリー
実際、これには、異なる JDK での intern() メソッドの異なる実装が関係しています。JDK6 および以前の JDK では: リーリー
JDK6 では、「java1」が最初に出現する文字列定数であるため、定数プールにコピーされ、intern() メソッドはオブジェクトを返します。したがって、定数プール内の str1 はヒープ上の str1 とは異なります。JDK7 では、「java1」が最初に表示される文字列定数ですが、intern() メソッドはこのオブジェクトを参照するだけであり、定数プールに追加してもコピーされません。 JDK6 のような定数プールに新しいオブジェクトを追加するため、 intern() メソッドによって返される参照は、実際には元の str1 と同じままです。
JDK6 と JDK7 をそれぞれ使用して上記のコードを実行しました。結果は次のとおりです。
リーリー質問者様のおっしゃる通り、本当でも嘘でもありませんが、主に以下の2つの理由があると思います。
リーリー
str1.intern() は定数プール内のオブジェクトを返すため、ヒープ上の str1 と同じオブジェクトではありません。そして:
空の文字列 "" が文字列 "python" に追加されるため、新しい文字列定数を追加しないことと同じになり、str2.intern() は引き続き定数プール内のオブジェクトを返します。リーリー
実際、上記の質問は次のように拡張できます。
リーリー
コードの最初の部分「StringBuilder("ja").append("va")」を「StringBuilder("ja").append("va1")」に変更しました。この変更によりどのような違いが生じますか。 ? 結果は?JDK6 と JDK7 で実行した結果を見てみましょう:
JDK6 と JDK7 の実行結果が異なるのはなぜですか?リーリー
実際、これには、異なる JDK での intern() メソッドの異なる実装が関係しています。
JDK7 以降の場合:JDK6 および以前の JDK では:
リーリー
リーリー
JDK6 と JDK7 の intern() メソッドの違いに基づいて、次の例がわかります。リーリー
JDK ごとに異なる結果が返される理由:JDK6 では、「java1」が最初に出現する文字列定数であるため、定数プールにコピーされ、intern() メソッドはオブジェクトを返します。したがって、定数プール内の str1 はヒープ上の str1 とは異なります。
JDK7 では、「java1」が最初に表示される文字列定数ですが、intern() メソッドはこのオブジェクトを参照するだけであり、定数プールに追加してもコピーされません。 JDK6 のような定数プールに新しいオブジェクトを追加するため、 intern() メソッドによって返される参照は、実際には元の str1 と同じままです。