gpt4 book ai didi

java - JLS 示例 3.10.5-1 之间的区别。字符串文字和 Oracle JDK?

转载 作者:搜寻专家 更新时间:2023-10-31 20:18:18 24 4
gpt4 key购买 nike

规范

Example 3.10.5-1. String Literals Java 语言规范 8 告诉我们:


由编译单元(§7.3)组成的程序:

package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }

和编译单元:

package other;
public class Other { public static String hello = "Hello"; }

产生输出:

true true true true false true

现实

但是用oracle jdk 1.8.0_65(win)编译运行输出

true true true true true true

问题一

为什么不一样?(我有一个猜测,并发布答案)

问题2

这是规范、编译器或解释器中的错误吗?

如果有任何此类情况,应向何处报告?


版本

"c:\Program Files\Java\jdk1.8.0_65\bin\java.exe" -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

"c:\Program Files\Java\jdk1.8.0_65\bin\javac.exe" -version
javac 1.8.0_65

最佳答案

问题 1 的答案

javac 编译器在编译时进行优化。

编译器将其识别为常量表达式:

String lo = "lo";

并得出结论,这也必须是一个常量表达式:

"Hel" + lo

因此假设整个术语是 interned作为字符串值常量表达式,我们将内部字符串与相等的内部字符串进行比较。因此我们比较相同的引用并得到 true 并且完整的检查可以被预评估为 true。

证据

  1. 字节码 (javap -c) 向我们展示了我们有一些预先计算。 1.、4. 和 5. 打印中的表达式只是替换为 "true"
  2. 以下代码解除优化:

来源

public class StringTest {
public static void main(final String[] args) {
final String hello = "Hello", lo = "lo";
String myLo = "";
if (Math.random() < 10) {
myLo = "lo";
}
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
// System.out.print((other.Other.hello == hello) + " "); // same package
System.out.print((hello == ("Hel" + "lo")) + " ");
System.out.print((hello == ("Hel" + lo)) + " ");
System.out.print((hello == ("Hel" + myLo)) + " ");
System.out.println(hello == ("Hel" + lo).intern());
}
}

输出:

true true true true false true

关于java - JLS 示例 3.10.5-1 之间的区别。字符串文字和 Oracle JDK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33398800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com