JDK1.7之下的inern用法:
String s = new String("1aaa");
s.intern();
String s2 = "1aaa";
System.out.println(s2 == s.intern()); true
System.out.println(s == s.intern()); false
String s = new String(“1aaa”);
生成了常量池的“1”和堆空間中的字符串對象。 s爲堆空間的內存地址。
s.inern() 檢查對象s是否在常量池中存在,如果存在然後返回該字符串在常量池中的地址。
String s2 = “1aaa”; s2指向的是“1aaa” 在常量池中的地址。因此
s2 == s.intern()爲true。
String s3 = new String("1a") + new String("1a");
s3.intern();
String s4 = "1a1a";
System.out.println(s4 == s3.intern()); true
String s3 = new String(“1a”) + new String(“1a”);
在常量池中生成字符串la,並在堆中生成s3指向的堆空間,內容爲lala。
此時常量池中沒有lala
s3.intern(); 檢查常量池中是否有lala,如果沒有,則將lala放入常量池中。並返回常量池的地址。
s.inern檢查常量池中是否存在某一個常量,如果存在則返回這個常量的值。
如果不存在,將字符串s的內容放入String常量池中,具體在JDK1.7中常量池不需要再存儲一份對象了,可以直接存儲堆中的引用,也就是s==s.inern 返回true。
PS: s==s.inern並不總是成立。如果常量池中已經存在了這個字符串,則s==s.inern並不相等。