关于String
类的intern()
方法,平时没怎么用过,在啃JVM这段时间突然遇到这玩意儿,突然发现还挺有意思的,记录下。
呐,先看例子(直接拿的书中的):
public class StringIntern {
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);
}
}
输出结果为:true false
,jdk是1.8的版本(1.7版本结果一样),1.6版本是两个false
。在1.6版本的JDK中,intern()
方法会将首次遇见的字符串实例直接复制到永久代中,返回的String
是永久代中这个字符串实例的引用,所以第一个比较就是永久代内存上的实例引用和堆内存上(StringBuilder
是对象,存放在堆内存上)的实例,所以两者必然不同,而在JDK1.7后,intern()
方法不再进行复制这一行为了,只是在常量池中记录首次出现该字符串的引用,返回的和首次出现该字符引用是同一个,所以第一个比较的结果是true
,第二个比较也是同样的道理。
intern()
方法主要是为了重用String
对象,节省内存消耗,可以通过循环创建字符串"xxx"
放进数组,为了作比较,再用"xxx".intern()
放进做一次同样的放入操作,可以发现后者可以节省更多的内存消耗,可以通过一些内存分析工具进行查看。