返回信息流分别执行(不是前后执行)
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
求助~
这是一条镜像帖。来源:北邮人论坛 / java / #58705同步于 2018/3/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[求助]Java常量池问题
rancho
2018/3/19镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
再补充一个:
分别执行(不是前后执行)
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"不一样,是这样吗?
我是这么理解的
首先看第一个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();
: ...................
是分别执行两段代码,上下没有关系,第二段哪里存在一个String常量“build”?
【 在 liuyehcf 的大作中提到: 】
: 我是这么理解的
:
: 首先看第一个case
额,我知道是分开执行的。。。
第二个Case的代码是这个不
String str = new StringBuilder("build").toString();
System.out.println(str.intern() == str);//false
第一行不是有个常量"build"么
【 在 rancho 的大作中提到: 】
: 是分别执行两段代码,上下没有关系,第二段哪里存在一个String常量“build”?
噢我懂了,谢谢~
【 在 liuyehcf 的大作中提到: 】
: 额,我知道是分开执行的。。。
: 第二个Case的代码是这个不
: [code=java]
: ...................