我从intern()
方法看到了下面的行为,困惑,有什么想法吗?
案例1:
String test3=new String("hello");
test3.intern();
String test4=new String("hello");
test4.intern();
if(test3==test4){
System.out.println("same obj refered for test3 and test4 ");
}
else{
System.out.println("new obj created for test4");
}
输出:
new obj created for test4
案例2:
String test3=new String("hello").intern();
//test3.intern();
String test4=new String("hello").intern();
//test4.intern();
if(test3==test4){
System.out.println("same obj referred for test3 and test4 ");
}
else{
System.out.println("new obj created for test4");
}
输出:
same obj referred for test3 and test4
答案 0 :(得分:4)
在CASE1中,您忽略了intern
的返回值。这就是为什么变量仍然包含对原始字符串对象的引用。
要了解最新情况,请考虑以下代码
String test1 = "hello";
String test2 = new String(test1);
String test3 = test2.intern();
System.out.println(test1 == test2);
System.out.println(test1 == test3);
打印
false
true
test1
是字符串池中分配的字符串文字"hello"
。 test2
是一个新的字符串对象,与test1
不同,但具有相同的字符内容。它在堆上分配。 test3
是intern
的结果,因为字符串池中已经存在字符串"hello"
,我们只返回对它的引用。因此test3
引用与test1
相同的对象。
答案 1 :(得分:-1)
这是因为intern()
方法返回一个interned String,它将指向实习池中的String实例而不是堆中的String实例。 If the String instance to be interned is already in the pool, reference to it is returned. If not then the String is added to the pool and reference to it is returned.
因此,您应该比较实习方法返回的字符串,而不是原始引用。