【发布时间】:2023-04-10 08:51:01
【问题描述】:
为什么这两个相似的代码sn-ps会导致不同的结果?
public class Test {
@org.junit.Test
public void test1() {
String s3 = "1" + new String("1");
String s5 = s3.intern();
System.out.println(s5 == s3);
}
@org.junit.Test
public void test2() {
String s3 = "g" + new String("g");
String s5 = s3.intern();
System.out.println(s5 == s3);
}
}
在 jdk 1.8.0_144 环境下试过,得到了这些答案(在 jdk6 中可能不同):
假的 和 真的
第一个 sn-p 在 Java8 中应该为真。 但更令人困惑的是,如果我将代码移到 main 方法中,它会导致 true。
public class TestWithoutJunit {
public static void main(String[] args) {
String s3 = "1" + new String("1");
String s5 = s3.intern();
System.out.println(s5 == s3);
}
}
我假设这是一种 JUnit 优化,所以我检查了字节码,jUnit 中的两个代码 sn-p 和 main 函数保持完全相同。
顺便说一下,我的 Java 版本
java 版本“1.8.0_144” Java(TM) SE 运行时环境 (build 1.8.0_144-b01) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.144-b01,混合模式)
【问题讨论】:
-
@AndréStannek 如果您理解这个问题,则不会。
-
无法复制。
java version "1.8.0_172" Java(TM) SE Runtime Environment (build 1.8.0_172-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode). -
在 jdk10 上运行这些 sn-ps,得到所有
trues(应该是这样) -
@Stylex 可能是因为 JUnit 导致 sun.text.resources.FormatData 类在您的代码之前加载。