Begin
如下的代码
public static void main(String[] args) {
String a1 = new String("cuiyaonan");
String a2 = new String("cuiyaonan").intern();
String a3 = "cuiyaonan";
System.out.println(a1 == a2); //返回false
System.out.println(a2 == a3); //返回ture
String a4="ab";
String a5="a" +"b";
System.out.println(a4 == a5); //true
}
如上new 出来的String对象 一定不会等于 intern()出来的String对象,即new String("")一定不会从字符串常量池中找对象.而是重新创建一个对象.
如上intern()对象的流程是: 先在字符串常量池中查找是否有相同的字符串,如果有就返回,如果没有就在字符串常量池中创建,并返回给new String("").---这个过程创建了2个对象,一个是字符串常量池中的字符串对象,另外一个就是new String("")对象,只不过new String("")存储的是字符串常量的引用.这里是有2个存储空间的.
参考JDK8的intern()的方法介绍
如上的intern()的具体实现使用了JNI,具体可以参考:https://cuiyaonan2000.blog.csdn.net/article/details/125178191
版本区别
Java6及以前,字符串常量池存放在永久代。
Java7中Oracle的工程师对字符串池的逻辑做了很大的改变,即将字符串常量池的位置调整到Java堆内。所有的字符串都保存在堆(Heap)中,和其他普通对象一样,这样可以让你在进行调优应用时仅需要调整堆大小就可以了。
Java8元空间,字符串常量在堆