情景1
public static void main(String[] args) throws Exception {
String s1 = "Testing";
String s2 = new String("Testing");
s2.intern();
if(s1==s2){
System.out.println("s1 equals to s2");
}else{
System.out.println("s1 is not equal to s2");
}
}
输出: s1 is not equal to s2
。
场景2
public static void main(String[] args) throws Exception {
String s1 = "Testing";
String s2 = new String("Testing").intern();
if(s1==s2){
System.out.println("s1 equals to s2");
}else{
System.out.println("s1 is not equal to s2");
}
}
输出: s1 equals to s2
。
我的问题是new String("Testing")
和new String("Testing").intern()
之间有什么区别?
答案 0 :(得分:3)
答案 1 :(得分:2)
Java String
是不可变的,因此您必须更新s2
引用。
将s2.intern();
更改为
s2 = s2.intern();
它将以同样的方式工作。
答案 2 :(得分:1)
阅读intern()
的Javadoc:
当调用intern方法时,如果池已经包含一个等于此String对象的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。
由于String s1 = "Testing";
将String
引用的s1
添加到String
池,new String("Testing").intern()
会从字符串池中返回一个等于创建的字符串的实例new String("Testing")
,与String
引用的s1
实例相同。
另一方面,在第一个代码段中,s2.intern()
无效。 String
等于“Testing”已经在String池中,因此String
引用的s2
不会添加到池中。而您忽略了该方法的返回值,即s1
引用的字符串。因此s1
和s2
引用不同的对象。