String.intern()方法
2018-01-22 本文已影响0人
wtmxx
public class TestIntern {
public static void main(String[] args) {
//这个String初始化语句,在堆区生成了String对象,并且在运行时常量池生成了"12"
String s = new String("12");
//jdk1.6和jdk1.7中的intern有着差别,jdk1.7中常量池位置由方法区变成了堆区
//jdk1.6中,执行此处的intern()会检查常量池是否有"12",如果有会返回常量池该处的引用;如果没有,
//则在常量池中新建一个"12"
//jdk1.7中,执行此处的intern()也会检查常量池,如果有会返回常量池该处引用;如果没有,如果堆区已经有
//了一个值相同的字符串对象,那么会在常量池保存该对象的引用而不是新建一个字符串。
s.intern();
//s2是指向常量区字符串的引用
String s2 = "12";
//jdk1.6中打印false,因为s指向堆中的String对象,s2指向常量池字符串
//jdk1.7中打印false,因为s.intern()时常量池已经存在"12",故s和s2指向对象不同
System.out.println(s == s2);
//这里在堆区新建了对象"11", 常量区新建了对象"1"
String s3 = new String("1") + new String("1");
//jdk1.6中执行intern()后, 在常量池新建了字符串"11"
//jdk1.7中执行intern()后,因为堆中已经存在"12"字符串,所以常量池保存的是s3的引用
s3.intern();
//s4指向常量池的"11"在jdk1.6中他指向的是常量池的11,在jdk1.7中他指向的是常量池中记录的s3的引用
String s4 = "11";
//jdk1.6中返回false
//jdk1.7中返回true
System.out.println(s3 == s4);
}
}