intern() of String

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

版本区别

  1. Java6及以前,字符串常量池存放在永久代。

  1. Java7中Oracle的工程师对字符串池的逻辑做了很大的改变,即将字符串常量池的位置调整到Java堆内。所有的字符串都保存在堆(Heap)中,和其他普通对象一样,这样可以让你在进行调优应用时仅需要调整堆大小就可以了。

  1. Java8元空间,字符串常量在堆

猜你喜欢

转载自blog.csdn.net/cuiyaonan2000/article/details/129007915
今日推荐