Java中的实习字符串

Tin*_*iny 4 java string string-interning

以下代码段实习字符串.

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

System.out.println(concat1=="mystring");
Run Code Online (Sandbox Code Playgroud)

表达式concat1=="mystring"返回true因为concat1已被实习.


如果给定的字符串mystring更改为string如下面的代码段所示.

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

System.out.println(concat11=="string");
Run Code Online (Sandbox Code Playgroud)

比较表达式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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Daw*_*ica 6

如果在同一程序中运行这两个片段,concat1.intern()则会添加concat1到实习字符串池中.但是concat11.intern()不会向池中添加任何内容,因为"string"它已经在池中(来自str2).所以你最后的比较,比较concat11str2-而这些是不是同一个对象.

来自Javadoc的http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/String.html

调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串.否则,将此String对象添加到池中,并返回对此String对象的引用.