注意:
-
需要注意的是
"na" + "me" != s1 + s2//其中s1="na", s2="me"
,由于s1是一个变量,javac编译器启动优化,自动生成StringBuilder,进行字符串连接操作,因此生成的新字符串会出现在java堆中,下面是截取的一部分反编译程序:
注意string.intern():将string对象拉入常量池,并返回一个指向常量池的引用。
public class Intern {
public static void main(String[] args) {
String s1 = "name";
String s2 = new String("name");
String s3 = "na";
String s4 = "me";
String s5 = "na" + "me";
String s6 = s3 + s4;
System.out.println(s1 == s2);//常量池 != 堆,false
System.out.println(s1 == s5);//均在常量池,true
System.out.println(s1 == s6);//由于StringBuilder在堆中生成了新对象,特别注意和上一个区别,false
System.out.println(s1 == s6.intern());//s6.intern(),拉回了常量池,如果常量池存在,直接返回,true
System.out.println(s2 == s2.intern());//false,s2.intern()返回一个新引用,指向常量池。
}
}