検索

ホームページ  >  に質問  >  本文

java - String的intern方法的疑问

天蓬老师天蓬老师2803日前841

全員に返信(1)返信します

  • 巴扎黑

    巴扎黑2017-04-18 10:08:31

    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
  • キャンセル返事