美文网首页
Java字符串常量池jdk1.8

Java字符串常量池jdk1.8

作者: lunabird | 来源:发表于2018-07-26 14:41 被阅读486次

看到一个简单的代码:

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

相关文章

  • Java中的常量池

    Java中的常量池分为三类:字符串常量池、class常量池、运行时常量池 字符串常量池 从1.7及其之后,字符串常...

  • 你对常量池够了解吗

    在 java 中,常量池分为以下三种: class 常量池 字符串常量池 运行时常量池 一、class 常量池 1...

  • 常量池、运行时常量池、字符串常量池

    常量池、运行时常量池、字符串常量池 Java里包含各种常量池,经常傻傻分不清楚,下面就简单梳理下Java中的池们。...

  • JVM内存划分 字符串常量池

    字符串常量池 【字符串常量池】独立于【运行时常量池】Java 6只能增加永久代-XX:MaxPermSize=1G...

  • String常量池

    java中有几种不同的常量池,以下的内容是对java中几种常量池的介绍以及重点研究一下字符串常量池。 class常...

  • 深入了解Java字符串常量池

    java中有几种不同的常量池,以下的内容是对java中几种常量池的介绍以及重点研究一下字符串常量池。 class常...

  • 字符串常量池

    静态常量池,运行期常量池,字符串常量池 静态常量池 运行时常量池 字符串常量池 问题 结果: 验证new Stri...

  • Java字符串常量池jdk1.8

    看到一个简单的代码: 运行结果如下:truefalse 在1.6中,常量池在方法区,intern()会把首次遇到的...

  • java常量池

    概述 java中有几个比较容易混淆的池的概念: 包装类的对象池 字符串常量池 class / 静态常量池 运行时常...

  • 记一个java常量池知识点

    今天复盘常量池问题发现之前不知道的问题 java常量池在方法区中属于线程共享 我们通常最常听说的都是字符串常量池 ...

网友评论

      本文标题:Java字符串常量池jdk1.8

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