美文网首页
String的intern()方法在JDK6及之后版本不同表现的

String的intern()方法在JDK6及之后版本不同表现的

作者: wbpailxt | 来源:发表于2021-05-01 19:25 被阅读0次
package string;

public class StringInternMethodPractice {
    public static void main(String[] args) {
        // append操作在堆内存中的字符数组
        StringBuilder stringBuilder1 = new StringBuilder("计算机").append("软件");
        // toString()将StringBuilder对象里的数组拷贝一份到String对象里头的数组
        String str1 = stringBuilder1.toString();
        System.out.println(str1.intern() == str1);

        StringBuilder stringBuilder2 = new StringBuilder("Ja").append("va");
        String str2 = stringBuilder2.toString();
        System.out.println(str2.intern() == str2);
    }
}

结果:
JDK6下输出false false ;JDK7下运行输出 true false

分析
1、JDK6,字符串常量池实现在永久代,intern()方法会把首次遇到的字符串实例复制到字符串常量池,返回的也是永久代里面这个字符串实例的引用。
调用str1的intern()方法,由于“计算机软件”这个位于堆的字符串首次出现,所以将该字符串实例复制到字符串常量池,并将字符串常量池的字符串实例引用返回。但是str1指向字符串实例在堆内存,所以两者比较为false。
Java这个位于堆的字符串不是首次出现,调用str2的intern()方法,就不需要复制了,返回永久代里面这个字符串实例的引用。所以两者比较为false。
2、JDK7,字符串常量池实现在堆中,intern()方法只需要在字符串常量池里记录一下首次出现的实例引用即可,不需要复制字符串。
调用str1的intern()方法,由于“计算机软件”这个位于堆的字符串首次出现,在字符串常量池里记录该对象的引用,并返回堆中该字符串实例的引用。所以两者比较为true。
Java这个位于堆的字符串不是首次出现,直接返回已经记录在字符串常量池里该对象的引用,虽然都是堆中的对象引用,但是不是同一个对象,所以返回false。

相关文章

网友评论

      本文标题:String的intern()方法在JDK6及之后版本不同表现的

      本文链接:https://www.haomeiwen.com/subject/fvfzrltx.html