[Java基础提高] String中intern的一个例题

前言:
前言,今天看见了一个关于intern的面试题,我很自信的把答案写上去了,然后看一了一眼答案,我竟然错了,什么原因呢,我觉得没有错,然后再IDE上面自己敲了一遍,哈哈,确实是错了,很尬尴。错了也好,那就来分析一下原因吧。

先贴出来这个代码段:

        String s1 = new StringBuilder("go")
                .append("od").toString();
        System.out.println(s1.intern() == s1);
        String s2 = new StringBuilder("ja")
                .append("va").toString();
        System.out.println(s2.intern() == s2);

先说答案,第一个是true,第二个是false。

intern方法

因为这里使用到了intern方法了,所以先来介绍一下这个方法吧。
JDK1.6:调用intern方法后,会先到字符串常量池查看是否有该字符串对象,如果正好有该字符串对象得话,则直接返回引用地址。如果没有得话,则在字符床常量池创建该字符串对象,并将引用地址进行返回。

JDK1.7:1.7则做了改进。再调用intern方法之后,会先到字符串常量池产看是否有该字符串对象,如果找到了该字符串对象,则直接返回引用地址。否则,将会到Java堆中进行查找,如果在堆上有该字符串实例化得对象,则将这个字符串添加到字符串常量池中,并将引用地址进行返回。如果Java堆中也没有得话,则直接再字符床常量池中创建该字符串对象,然后返回引用地址。

分析

根据上面得intern方法,我们再来分析这个题,这两个都应该是true呀,怎么变成了false了呢。因为我们不知道这里有一个隐藏知识点,在字符串常量池中已有java对象。为了验证我们也让字符串常量池中有good这个字符串对象,看一看结果。


        String s = "good";
        String s1 = new StringBuilder("go")
                .append("od").toString();
        System.out.println(s1.intern() == s1);
        String s2 = new StringBuilder("ja")
                .append("va").toString();
        System.out.println(s2.intern() == s2);

这回在运行,就是两个false。
好了这回你们知道原因了吧! 我也又学会了一个知识点很开心!!

发布了157 篇原创文章 · 获赞 34 · 访问量 4396

猜你喜欢

转载自blog.csdn.net/qq_39397165/article/details/104267001