为什么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引用,则仅将引用添加s1String池中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文字,这些文字在您的代码执行之前会自动插入。


以上是为什么newString()+newString()在JDK8下返回不同的结果的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>