加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 01:04:09 所属栏目:Java 来源:网络整理
导读:规格 Java语言规范8的Example 3.10.5-1. String Literals告诉我们: 该程序由编译单元组成(第7.3节): package testPackage;class Test { public static void main(String[] args) { String hello = "Hello",lo = "lo"; System.out.print((hello == "Hello")

规格

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

该程序由编译单元组成(第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

问题1

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

问题2

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

如果有的话,在哪里举报?

版本

"c:Program FilesJavajdk1.8.0_65binjava.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 FilesJavajdk1.8.0_65binjavac.exe" -version
javac 1.8.0_65
最佳答案
回答问题1

javac编译器在编译期间进行优化.

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

String lo = "lo";

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

"Hel" + lo

因此假设整个项是interned作为字符串值常量表达式,我们将一个实习字符串与一个相等的实习字符串进行比较.因此,我们比较相同的引用并获得真实,并且可以将完整检查预先评估为真.

证据

>字节代码(javap -c)向我们显示我们有一些预先计算.来自1.,4.和5. print的表达式只是替换为“true”.
>以下代码解除了优化:

资源

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读