Java 中new String("字面量") 中 "字面量" 是何时进入字符串常量池的?

原问题是关于 intern方法的。 在看了很多博文以后,我总结出了我所真正困惑的关键所在:字面量进入字符串常量池的时机。 对于代码: class Ne…
关注者
193
被浏览
90,070
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

很显然,题主应该是Jdk7的环境下执行的上述验证代码;


如果在JDK6的环境下执行上述代码,得到的结果应该是false false false


------------------

只需要结合以下几个结论就能解释题主以及这两段代码在JDK6和JDK7下的不同表现


  • 直接使用双引号声明出来的String对象会直接存储在常量池中。
  • 如果不是用双引号声明的String对象,可以使用String提供的intern方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中
  • 如果是new 出来的String对象,将会在堆上直接创建对象
  • JDK6中的intern方法,由于堆中的字符串常量池pool在Perm中,与堆中其他对象是分开的,于是乎如果一个只存在于堆中的String对象调用这个方法,将会在string pool当中重新创建该对象,并返回其引用;但是在JDK7中Perm的概念不存在了,该方法将直接在常量池中保存堆中的引用,不会创建新的对象

想详细了解该部分知识的可以参看