3

オブジェクトが含まれていない場合、 String.intern() がプールに文字列を追加することは知っていますが、結果を説明する方法。

以下のコード:

public static void main(String[] args) {

        char[] abc = new char[]{'a','b','c'};
        String str = new String(abc);
        System.out.println(str == "abc");
        str.intern();
        System.out.println(str == "abc");
    }

出力は次のとおりです。

間違い

間違い

ただし、次のようなコードの場合:

public static void main(String[] args) {

        char[] abc = new char[]{'a','b','c'};
        String str = new String(abc);
        str.intern();
        System.out.println(str == "abc");
    }

出力は次のとおりです。

真実

違いは何ですか。

4

1 に答える 1

7

違いは、Stringへの明示的な呼び出しの前にリテラル "abc"を使用するinternと、暗黙的にインターンされることです。

str.intern()strが参照するインスタンスを String プールに格納しませんString

最初のスニペット:

System.out.println(str == "abc"); // "abc" is interned
str.intern(); // str is not stored in the pool
System.out.println(str == "abc"); // returns false

2 番目のスニペット:

str.intern(); // str is stored in the pool
System.out.println(str == "abc"); // returns true

intern の Javadoc から:

文字列 java.lang.String.intern()

intern メソッドが呼び出されたときに、equals(Object) メソッドによって決定されたこの String オブジェクトと等しい文字列がプールにすでに含まれている場合、プールからの文字列が返されます。それ以外の場合、この String オブジェクトがプールに追加され、この String オブジェクトへの参照が返されます... すべてのリテラル文字列と文字列値の定数式はインターンされます。

于 2021-01-05T08:04:02.147 に答える