String中的intern方法
参考:https://blog.csdn.net/goldenfish1919/article/details/91043638
在jdk6及之前,调用.intern方法时如果常量池中不存在该字符串,则会拷贝到常量池中
在jdk7及之后,如果发现没有在常量池中,不是拷贝到常量池中,而是生成一个指向堆中该对象的引用在常量池中,
我下面分析的是jdk1.7之后的代码
public class StringTest {
public static void main(String[] args) {
String s3 = new String("1")+new String("2");
String s4 = "12";//常量池中创建“12”
s3.intern();//啥都不干
System.out.println(s3==s4);//false 在常量池中的“12”,与堆中是不同的
}
}
将.intern()方法置到后面
public class StringTest {
public static void main(String[] args) {
String s3 = new String("1")+new String("2");
s3.intern();//发现常量池没有,生成一个引用在常量池中
String s4 = "12";//指向该引用
System.out.println(s3==s4);//true,常量池中的“12”是同一个引用
}
}
总结:
从jdk7开始,常量池中的字符串分为两类,一类是本身就存在于池中的字符串,一类是本身存在于堆中但是引用存在于池中的字符串,而在jdk6以前常量池和堆是完全分开的两个东西。