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)
如果在同一程序中运行这两个片段,concat1.intern()则会添加concat1到实习字符串池中.但是concat11.intern()不会向池中添加任何内容,因为"string"它已经在池中(来自str2).所以你最后的比较,比较concat11来str2-而这些是不是同一个对象.
来自Javadoc的http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/String.html
调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串.否则,将此String对象添加到池中,并返回对此String对象的引用.