- 在jdk1.6,intern的实现是,将首次遇到的字符串复制一份到方法区中,并返回指向方法区的新字符串的引用
- 在jdk1.7和jdk1.8,intern的实现就不是复制一份实例了,而是把首次遇到的字符串的引用放入方法区中
以下引用深入理解Java虚拟机里的一个例子
String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1); // "计算即软件"是第一次出现,所以str1.intern()返回的就是str1在堆里的引用,所以这里输出true
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2); // "java"是已经存在方法区常量池的字符串,所以str2.intern()返回的是其它的引用,所以这里输出false