当调用intern()方法,如果常量池中已经有对应String的字符串(通过equals判断),就返回常量池中对应字符串的引用地址
例子:
public static void main(String[] args) {
String a = "a";
String b = "b";
String str1 = a + b;
String str2 = "ab";
String str3 = new String("ab");
System.out.println(str1 == str2);
System.out.println(str1.intern() == str2);
System.out.println(str3 == str2);
System.out.println(str3.intern() == str2);
System.out.println(str3.intern() == str1.intern());
}
输出:
false
true
false
true
true
变量a和b是放到常量池里面的,a+b首先在堆里面新开一个空间存放”ab”,然后把引用地址给了str1,str2也是放到了常量池里面,str3直接在堆里面开了一个空间存放”ab”,把引用地址给了str3,所以str1、str2、str3肯定都不相等,str1.intern()之后,首先会在常量池里面查找”ab”常量,发现是有的(就是str2指向的内容),于是就返回了str2的内容,所以str1.intern() == str2为true,同理就有了str3.intern == str1.intern()为true