http://www.cnblogs.com/wanlipeng/archive/2010/10/21/1857513.html
从上面文章来看,String中intern()返回字符池中原与字符串值相等的引用
那么什么时候从字符串池取值呢?
从上面的文章可以知道
字符串相加的时候,都是静态字符串的结果会添加到字符串池,如果其中含有变量(如f中的e)则不会进入字符串池中。但是字符串一旦进入字符串池中,就会先查找池中有无此对象。如果有此对象,则让对象引用指向此对象。如果无此对象,则先创建此对象,再让对象引用指向此对象
如果不是静态字符串,则返回的不是字符串池中的引用
public static void main(String[] args) {
String str1 = "a";
String str2 = "a";
String str3 = new String("a");
String str4="ab";
String str5="b";
String str6="a"+str5;
String str7="a"+"b";
String str8=new String("ab");
System.out.println(str7==str4);//true,都是字符串池中的引用
System.out.println(str4==str6);//str6不是字符串池中的引用
System.out.println(str4==str6.intern());//true
System.out.println(str8.intern()==str6);//str6返回的不是字符串池中的引用,str8是字符串池中的引用
System.err.println(str1 == str2); //true
System.err.println(str1 == str3); //false
str3 = str3.intern();
System.err.println(str1 == str3); //true
}