为什么newString()+newString()在JDK8下返回不同的结果
以下代码在JDK8 1.8.0_171下有不同的结果
@Test
public void test2() {
String s1 = new String("a") + new String("a");
s1.intern();
String s2 = "aa";
System.out.println(s1 == s2); //true
}
@Test
public void test3() {
String s1 = new String("1") + new String("1");
s1.intern();
String s2 = "11";
System.out.println(s1 == s2); //false
}
唯一的区别是值:“a”而不是“1”,我得到的结果是不同的。为什么是这样?
回答
s1.intern()如果池中尚未包含一个等于它的String引用,则仅将引用添加s1到String池中String。
字符串常量,如“AA”和“11”总是被拘留,所以他们总是会==在例如,通过返回s1.intern()。
因此,是否s1 == s2返回true取决于String池中是否包含一个Stringequals to s1befores1.intern()被调用。
- 如果
s1.intern()是,== s2则不是== s1,因此System.out.println(s1 == s2)将打印false。 - 如果没有,
s1.intern () == s1 == s2,那么System.out.println(s1 == s2)将打印true。
这可能会在 Java 版本之间发生变化,因为不同版本的 JDK 类可能包含一组不同的String文字,这些文字在您的代码执行之前会自动插入。
THE END
二维码