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并不相等。