Java字符串常量池jdk1.8

看到一个简单的代码:

public static void main(String[] args) throws InterruptedException {

        String s0 = new StringBuilder().append("he").append("llo").toString();
        System.out.println(s0.intern() == s0);

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

    }

运行结果如下:
true
false

在1.6中,常量池在方法区,intern()会把首次遇到的字符串实例复制到永久代中,返回的也是这个永久代中字符串实例的引用;
而在1.7,1.8中,String 的 intern 方法首先将尝试在常量池中查找该对象的引用,如果找到则直接返回该对象在常量池中的引用地址;若不存在就会将当前字符串放入常量池中;

看看上面代码的例子:

s0在堆中创建了“hello”这个字符串对象,然后这个“hello”被加到常量池中,s0返回的其实是常量池中的引用地址,s0.intern()也取的是常量池的引用地址,所以s0.intern() == s0.

s1的情况特殊,这是因为常量池在初始化的时候会内置一些字符串常量进去,在rt.jar里面已经用到了“java”这个字符串,那么s1指向的是在堆中新建的的“java”字符串,s1.intern()指向的是常量池中的“java”,虽然常量池也位于堆中,但是这是两个不同的位置,所以s1.intern() != s1.

参考:
https://tech.meituan.com/in_depth_understanding_string_intern.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从网上复制的,看别人的比较全面,自己搬过来,方便以后查找。原链接:https://www.cnblogs.com/...
    lxtyp阅读 1,383评论 0 9
  •   需要说明的一点是,这篇文章是以《深入理解Java虚拟机》第二版这本书为基础的,这里假设大家已经了解了JVM的运...
    Geeks_Liu阅读 14,135评论 5 44
  • 前言 RTFSC (Read the fucking source code )才是生活中最重要的。我们天天就是要...
    二毛_coder阅读 479评论 1 1
  • 14:30——15:50深圳南山区 如果大家看到我不像个校长了,那我一定也当不好局长了。 (一)确定教育“南山质量...
    祎斐阅读 379评论 0 0
  • 1. 破窗效应: 错误一定要扼杀在萌芽中,否则将会变本加厉。如果管控不及时,便会导致破窗效应,甚至能引发更为严重的...
    城市格调刘姣阅读 77评论 0 0