最近在《深入理解Java虚拟机》一书中了解到,以下内容在Java7中第一个返回true,第二个返回false,产生了一些疑惑,经过一番搜索,对intern的理解有所加深,这里记一下。
public class RuntimeConstantPoolOOM { public static void main(String[] args) { String str1 = new StringBuilder("计算机").append("软件").toString(); System.out.println(str1.intern() == str1); String str2 = new StringBuilder("ja").append("va").toString(); System.out.println(str2.intern() == str2); } }
很久前就知道intern会在常量池中创建常量,但是第一个为什么是true?
回过头来再去了解intern,原来在java7之后,intern方法在第一次将字符串加入常量池的时候,是以当前对象作为常量放进的常量池的。
因此,str1的intern被调用的时候,str1本身已经被放进了常量池,因此第一个是true
第二个是因为java这个字符串在java7中其它地方出现过,不满足第一次出现的条件。
参考:
https://www.zhihu.com/question/51102308
https://blog.csdn.net/weixin_44201525/article/details/120897052
看到一个图不错:
转自:https://www.csdn.net/tags/OtTaYgxsMDg0NDktYmxvZwO0O0OO0O0O.html