java中String的intern()方法

 

帮助解释一下为什么java7以后这两个结果不相同,感谢大佬解答

字符串调用intern()方法后,如果常量池中有与这个字符串相同的就直接返回常量池中的,如果没有就把字符串加入到常量池中再返回字符串的引用,

“good”在常量池中没有,所以会加入,s1.intern()与s1是同一个引用

“java”字符串已经在常量池中了,所以s2.intern()是返回的常量池中的,s2是在堆上,不同

因为题主的字符串(“java”)比较特殊,JVM在启动的时候会加载一些有关运行环境的类,类中定义了一些字符串常量(比如java这个字符串),这个时候常量池就已经有了这个字符串具体可以看看(sun.misc.Version),添加虚拟机参数-verbose:class 可以打印虚拟机已经加载的类,其中就有它,不信的话你把你还可以把java这个字符串改为你的java版本号。 至于为什么在1.7之后出现了这个问题,原因是在1.7之后由于常量池的改动(1.7以前常量池不在堆中,所以相同字面量的字符串指向两个不同的对象)

谢谢大佬解答,我茅塞顿开,终于理解了这个问题