参考博客:https://blog.youkuaiyun.com/soonfly/article/details/70147205
博客写的非常清楚,补充以下内容:
public native String intern(); 方法为本地方法
根据场景进行方法说明:
场景一可以得出结论:在s2.intern()方法调用 之后,s2的指针不变,仍然指向堆内地址,方法返回指向了常量池中的字符串。
在常池中有字面量存在,调用intern后,直接返回字符串常量地址,在s2原引用不变。
String s2 = new String("abc"); String s1 = "abc"; String s3= s2.intern(); String s4="abc"; System.out.println(s1==s2); //false System.out.println(s1 == s3); //true System.out.println(s1 == s4); //true
场景二可以得出结论:s2.inter()调用后,在常池中产生了一个指向堆"abc"的指针,字面量定义s4时,s4 直接引用此指针
String s2 = new String("abc"); String s3= s2.intern(); String s4="abc"; System.out.println(s3==s2); //false System.out.println(s4 == s3); //true
jdk1.7以后,常量池中要么是字符串原始内容,要么是指向堆中指针,相同的字面量只存在一种 。