public static void main(String[] args) {
String s1 = new String("hello");
String intern1 = s1.intern();
String s2 = "hello";
System.out.println(s1 == s2);
String s3 = new String("hello") + new String("hello");
String intern3 = s3.intern();
String s4 = "hellohello";
System.out.println(s3 == s4);
}
返回结果:
在jdk1.6下运行的结果为:
false,false
在jdk1.7,1.8下运行的结果为:
false,true
对调 String intern3 = s3.intern();
String s4 = "hellohello";之后在jdk1.8下 false false
原因
intern() 方法返回字符串对象的规范化表示形式。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
我猜测,如果调用intern方法的时候常量池里没有这个字符串,会在常量池新建这个字符串,然后将String的指向指到常量池,这个时候在写String s4 = "hellohello"; s4也会指向常量池,如果调用intern方法的时候常量池里有这个字符串,应该是会更新对象的指向到这个常量池,但是不更新对象的地址。
s1!=s2 是因为声明s1的时候常量池中初始化了这个字符串,在调用方法的时候,方法没有对s1的对象做任何操作,只是返回了这个字符串.
s3==s4是因为 s3声明的时候+操作会new一个Stringbuffer,然后app,Stringbuffer不会在常量池中初始化"hellohello"字符串,在调用方法的时候,会去常量池初始化这个字符串,并跟新s4的指针。
intern详解见转载http://www.jianshu.com/users/90ab66c248e6/latest_articles