java - String的intern方法的疑问
天蓬老师
天蓬老师 2017-04-18 10:06:31
0
1
821
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(1)
巴扎黑

JDK6 と JDK7 をそれぞれ使用して上記のコードを実行しました。結果は次のとおりです。

リーリー

質問者様のおっしゃる通り、本当でも嘘でもありませんが、主に以下の2つの理由があると思います。

  • 文字列「java」は特別で、定数プールに固定されています

これがコードです

リーリー

str1.intern() は定数プール内のオブジェクトを返すため、ヒープ上の str1 と同じオブジェクトではありません。

  • 「python」文字列はコード内にすでに出現しているため、定数プールに追加されます。

コードの 2 番目の部分では、リテラル定数「python」が出現するため、定数プールに追加されます。

そして:
リーリー

空の文字列 "" が文字列 "python" に追加されるため、新しい文字列定数を追加しないことと同じになり、str2.intern() は引き続き定数プール内のオブジェクトを返します。


実際、上記の質問は次のように拡張できます。

リーリー

コードの最初の部分「StringBuilder("ja").append("va")」を「StringBuilder("ja").append("va1")」に変更しました。この変更によりどのような違いが生じますか。 ? 結果は?

JDK6 と JDK7 で実行した結果を見てみましょう:
リーリー

JDK6 と JDK7 の実行結果が異なるのはなぜですか?

実際、これには、異なる JDK での intern() メソッドの異なる実装が関係しています。
JDK6 および以前の JDK では:
リーリー

JDK7 以降の場合:

リーリー

JDK6 と JDK7 の intern() メソッドの違いに基づいて、次の例がわかります。

リーリー

JDK ごとに異なる結果が返される理由:

JDK6 では、「java1」が最初に出現する文字列定数であるため、定数プールにコピーされ、intern() メソッドはオブジェクトを返します。したがって、定数プール内の str1 はヒープ上の str1 とは異なります。
JDK7 では、「java1」が最初に表示される文字列定数ですが、intern() メソッドはこのオブジェクトを参照するだけであり、定数プールに追加してもコピーされません。 JDK6 のような定数プールに新しいオブジェクトを追加するため、 intern() メソッドによって返される参照は、実際には元の str1 と同じままです。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート