String.intern()分析
String::intern()方法是个本地方法,它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用;否则,则会将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。
仅限JDK8(元空间),JDK7运行结果是不同的
判断这个常量是否存在于常量池。
如果存在
判断存在内容是引用还是常量,
如果是引用,
返回引用地址指向堆空间对象,
如果是常量,
直接返回常量池常量
如果不存在,
将当前对象引用复制到常量池,并且返回的是当前对象的引用
String a1 = "AA";
System.out.println(a1 == a1.intern()); //true ,a1引用==a1引用
String a2 = new String("B") + new String("B");
System.out.println(a2 == a2.intern());//true ,a2引用==a2引用
String a3 = new String("B") + new String("B");
System.out.println(a2 == a3);//false ,a2引用==a3引用
System.out.println(a2.intern() == a3.intern());//true ,a2引用==a2引用
System.out.println(a2 == a3.intern());//true ,a2引用==a2引用
System.out.println(a3.intern() == a2.intern());// ,a2引用==a2引用
System.out.println(a3 == a2.intern());//false ,a3引用==a2引用
System.out.println(a3 == a3.intern());//false, ,a3引用==a2引用
String a4 = new String("C") + new String("C");
System.out.println(a4 == a4.intern()); //true ,a4引用==a4引用
String a5 = new String("A") + new String("A");
System.out.println(a1 == a5);//false ,a1引用==a5引用
System.out.println(a1 == a5.intern());//true ,a21引用==a1引用