public static void main(String[] args) {
String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);
String s3 = new String("1") + new String("1");
s3.intern();
String s4 = "11";
System.out.println(s3 == s4);
}
console:
false
true
逐句简单解释一下上面这一段代码发生了什么。
String s = new String("1");//在堆(heap)内存中创建一个“1”字符串对象
s.intern();//在String池中查找,发现没有“1”这个字符串,就在其中创建了“1”这样一个字符串
String s2 = "1";//s2在String池中查找有没有“1”这个字符串,上一步创建的那个字符串,并把引用赋给s2
System.out.println(s == s2);//s 和 s2由于内存上并不指向同一个区域(一个在对内存上,一个是在String 池里),所以此处为false
String s3 = new String("1") + new String("1");//此处在编译阶段会被直接解读为String s3 = "11";s3在String池中查找“11”,没找到,于是自己创建了一个“11“这样一个字符串
s3.intern();//s3检查String池中有没有”11“,找到了上一步创建的字符串,返回”11“,但是没变量去接收
String s4 = "11";//s4在String池中查找”11“,找到上上步创建的字符串,获得了字符串的引用
System.out.println(s3 == s4);//因为s3和s4都指向String 池里的那个字符串,所以内存地址相同,所以此处为true