String s1 = new String("aa") + new String("bb");
s1.intern();
String s2 = "aabb";
System.out.println(s1 == s2);//true
我已经了解,JDK6中intern()
会在常量池中不存在的情况下直接拷贝值放入常量池,而JDK7是会把堆中的引用放入常量池。
这段代码中的字面量"aa" "bb" "aabb"
在编译器就已经放入常量池中了,很多文章都说成执行到String s2 = "aabb"
才把 “aabb”放入常量池,我认为是不对的。
所以在s1.intern()
这个操作应该是没有产生任何副作用的,s1仍然指向堆中的一个对象,s2仍然指向常量池中的一个对象。
但实际结果却为true,而且把String s2 = "aabb"
移动到s1.intern()
前面,结果就是我所预期的false。到底是为什么呢?
先说点别的:
"xxx"
这样的字面量声明自带intern
String x = x.intern()
,因为可能会返回常量池里的引用intern
属于用时间换空间,一般也很少用到…intern
之前,这个字符串不会进入字符串常量池中再说你这个例子:
s1.intern()
发生在s2
的声明之前,s1
进常量池,s2
的声明自带intern
,从常量池里找到s1
赋值给自己,于是和s1
是同一个引用s2
先声明,进常量池,s1
需要计算,得到一个新的字符串,和s2
就不是同一个了,这时候如果做s1.intern() == s2
还是true