4

次のコード セグメントは、文字列をインターンします。

String str1="my";
String str2="string";
String concat1=str1+str2;
concat1.intern();

System.out.println(concat1=="mystring");

がインターンされたため、式concat1=="mystring"が返されます。trueconcat1


指定された文字列が次のスニペットに示すようにmystring変更された場合。string

String str11="str";
String str12="ing";
String concat11=str11+str12;
concat11.intern();

System.out.println(concat11=="string");

比較式は をconcat11=="string"返しますfalse。によって保持されている文字列concat11はインターンされていないようです。私はここで何を見落としていますか?

Java 7、アップデート 11 でテストしました。


編集:

コード全体:

package test;

public final class Test
{
    public static void main(String... args)
    {
        String str11="my";
        String str12="string";
        String concat11=str11+str12;
        concat11.intern();
        System.out.println(concat11=="mystring");

        String str1="str";
        String str2="ing";
        String concat1=str1+str2;
        concat1.intern();
        System.out.println(concat1=="string");
    }
}
4

3 に答える 3

6

これらのスニペットの両方を同じプログラムで実行すると、インターンされた文字列のプールにconcat1.intern()追加されます。concat1ただし、はすでにconcat11.intern()プールにあるため (から)、プールには何も追加しません。したがって、最後の比較は - と比較していますが、これらは同じオブジェクトではありません。"string"str2concat11str2

http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/String.htmlの Javadoc から

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

于 2013-10-20T21:56:58.237 に答える