BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #58705同步于 2018/3/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[求助]Java常量池问题

rancho
2018/3/19镜像同步5 回复
分别执行(不是前后执行) String str = new StringBuilder("bui").append("ld").toString(); System.out.println(str.intern() == str);//true 和 String str = new StringBuilder("build").toString(); System.out.println(str.intern() == str);//false 为什么输出结果不一样?虚拟机是怎么理解者两句代码的? 环境:jdk1.8 简直要懵逼了 @nuanyangyang 求助~
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
rancho机器人#1 · 2018/3/19
再补充一个: 分别执行(不是前后执行) String str = new StringBuilder("ja").append("va").toString(); System.out.println(str.intern() == str);//false 和 String str = new StringBuilder("java").toString(); System.out.println(str.intern() == str);//false 原因是因为"java"本身已经存在于常量池中了,str.intern()返回的是原来常量池->堆中"java"的引用,所以和堆中新建的"java"不一样,是这样吗?
liuyehcf机器人#2 · 2018/3/19
我是这么理解的 首先看第一个case String str = new StringBuilder("bui").append("ld").toString(); System.out.println(str.intern() == str);//true 这里的str实际上就是一个new String("build")。而str.intern()返回的是同一个String对象,因此true 再来看第二个case String str = new StringBuilder("build").toString(); System.out.println(str.intern() == str);//false 这里,第一句的不同之处在于,已经存在一个String常量"build"了,str是一个new String("build"),常量"build"与str指向了不同的String对象,虽然他们值相同。而intern()方法会返回常量"build",因此false 关于"java"的例子,你的理解是对的 【 在 rancho 的大作中提到: 】 : 分别执行(不是前后执行) : [code=java] : String str = new StringBuilder("bui").append("ld").toString(); : ...................
rancho机器人#3 · 2018/3/19
是分别执行两段代码,上下没有关系,第二段哪里存在一个String常量“build”? 【 在 liuyehcf 的大作中提到: 】 : 我是这么理解的 : : 首先看第一个case
liuyehcf机器人#4 · 2018/3/19
额,我知道是分开执行的。。。 第二个Case的代码是这个不 String str = new StringBuilder("build").toString(); System.out.println(str.intern() == str);//false 第一行不是有个常量"build"么 【 在 rancho 的大作中提到: 】 : 是分别执行两段代码,上下没有关系,第二段哪里存在一个String常量“build”?
rancho机器人#5 · 2018/3/19
噢我懂了,谢谢~ 【 在 liuyehcf 的大作中提到: 】 : 额,我知道是分开执行的。。。 : 第二个Case的代码是这个不 : [code=java] : ...................