public static void main(String[] args) {
String s1 = new String("1") + new String("1");
s1.intern();
String s2 = "11";
System.out.println(s1 == s2); // This result is true.
}
@Test
public void test2(){
String s1 = new String("1") + new String("1");
s1.intern();
String s2 = "11";
System.out.println(s1 == s2); // This result is false.
}
1.为什么我的代码在main方法中的执行结果与在JUnit单元测试中的执行结果不同
1条答案
按热度按时间bxgwgixi1#
由于
intern()
的返回示例将被忽略,因此代码的行为将有所不同,具体取决于"11"
字符串是否已被暂存。请参阅
intern()
方法的文件:调用intern方法时,如果池中已经包含一个等于此String对象的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。
换句话说,当字符串还没有被暂存时调用
s1.intern()
,将返回相同的示例,也就是说,s1
的示例将是被暂存的示例,因此s1 == "11"
将导致true
。否则,如果"11"
已经被添加到池¹中,s1.intern()
将返回已经在池中并且没有改变存储在s1
中的引用的示例;因此s1 == "11"
必须返回false
。使用
intern()
方法的 * 正确 * 方法是使用返回的示例:这保证了
s1
始终是字符串池中的示例。¹字符串将通过以前对具有相同内容的字符串调用
intern()
或在任何地方(包括任何库或标准类)使用"11"
文本而添加到池中。比较字符串是否已在池中时可能发生的情况。
@100
表示指向示例的指针,数字(100
)是该示例的虚构ID(或地址)。"11"
尚未在池中:"11" // @100
已在池中,可能之前使用过该文字: