举例说明:
String str2 = new String("str")+new String("01");
str2.intern();
String str1 = "str01";
System.out.println(str2==str1);
在JDK 1.7下,当执行str2.intern();时,因为常量池中没有“str01”这个字符串,所以会在常量池中生成一个对堆中的“str01”的引用(注意这里是引用 ,就是这个区别于JDK 1.6的地方。在JDK1.6下是生成原字符串的拷贝),而在进行String str1 = “str01”;字面量赋值的时候,常量池中已经存在一个引用,所以直接返回了该引用,因此str1和str2都指向堆中的同一个字符串,返回true。
String str2 = new String("str")+new String("01");
String str1 = "str01";
str2.intern();
System.out.println(str2==str1);
将中间两行调换位置以后,因为在进行字面量赋值(String str1 = “str01″)的时候,常量池中不存在,所以str1指向的常量池中的位置,而str2指向的是堆中的对象,再进行intern方法时,对str1和str2已经没有影响了,所以返回false。
---------------------
以上是一篇帖子的陈述,我为了保证环境的一致性,分别在jdk 1.6 ,1.7, 1.8环境下做了测试,发现结果都是一致的,与上文中表述的观点有出入,即将中间两行调换位置后结果为false的结论。
其实我们可以看看intern()方法的源码解释:
这方法是个native方法,并不是由java来实现的,我们可以看到红色箭头所指的那段话,只要s1.equals(s2)为true,那么s1.intern()就等于s2.intern(),而String s="a"; s与s.intern()是恒等的,所以最后比的就是内容罢了,
并不是调换了顺序,就导致引用不一样而返回false。