专栏首页ImportSourceJVM的String Pool到底是个什么鬼?

JVM的String Pool到底是个什么鬼?

摘要:有关string,你一定看了不少的内容。你可能以前也看到过类似“new String(“xxx”)和String s2 = “Cat" 有什么区别?”之类的问题,那么你也许听说过String Pool这个概念。本文主要通过详解String Pool来尝试解答类似这样的问题。

正如她的名字一样,String Pool就是一个String的池,这个池是被存储在Java Heap Memory中的。公众号ImportSource之前的《原来JVM中的堆栈TM这么简单!》一文中提到过有关String Pool的内容(你可以关注importsource查看具体内容)。你可以移步了解。我们都知道String在java中是个特别special的类,我们除了可以通过双引号直接创建对象外(String s2 = "Cat"),还可以通过new String(“Cat”)这样的方式来创建对象。

下面我们就上一张图,这个图详细解释了在heap空间的字符串池(String Pool)是如何工作的。

相信你看了图以后大概明白了,之所以有String 池这种实现,是因为String在java中是不可变的(immutable)。并且这个池是一个“String interning理念”的实现。至于这个 String interning是个什么意思,这里你就可以理解为拷贝或者指向同一值,就像上图中的那样,s1和s2指向同一个 Cat,而不用再新开辟一格来再放入一个 Cat。另外这个String Pool的这种做法也是对设计模式中 Flyweight design pattern的一个运用。(有关设计模式的内容在我们公众号的底部点击“新人礼”可以查看源代码。)

String Pool帮Java Runtime节省了大量的空间,尽管她也使得我们创建一个String需要花更多的时间。没关系,凡事总有利弊。下面来说用new创建字符串和直接用双引号之间的区别。

当我们使用双引号的方式来创建一个字符串的时候,java runtime会首先去String池里找看有没有这个字符串,如果找到了,那么就返回这个串的引用,否则就会在池中新建一个String,然后再返回引用。

然而呢,如果我们使用new操作符来创建字符串对象的话,那么java就会强制String类创建一个新的字符串对象,正如你在上图中看到的一样,new出来的string并不在池中,但我们可以使用intern()方法把这个对象put到池中或者也可以把这个对象指向池中的另外一个具有相同值的对象上去。

下面是一个简单的例子。

StringPool.java

public class StringPool { /** * Java String Pool example * @param args */ public static void main(String[] args) { String s1 = "Cat"; String s2 = "Cat"; String s3 = new String("Cat"); System.out.println("s1 == s2 :"+(s1==s2)); System.out.println("s1 == s3 :"+(s1==s3)); } }

输出结果:

s1 == s2 :true s1 == s3 :false


本文分享自微信公众号 - ImportSource(importsource),作者:贺卓凡

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-05-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java8真不用再搞循环了?

    Java8以后真的不用循环了?真的不用了? 好吧,本文分享的内容是java8之前和java8之后一些代码的不同写法,我们会先介绍java8之前和java8之后不...

    ImportSource
  • 面试官问他Java中“a”+“b”究竟会产生几个对象?

    有人在群里提问说“刚才面试官问他:‘Java中“a”+“b”究竟会产生几个对象?’”。

    ImportSource
  • 来自JVM的一封ClassFile介绍信

    我是一个class文件。我的内部是由一个被叫做ClassFile的structure组成。 我在jvm中占有很重要的地位,你可去看看jvm规范中我占了多少篇幅...

    ImportSource
  • Java基础知识之Scanner类和String类学习,讲明白了,适合初学者

    1、Scanner 的概述和方法介绍 A:Scanner 的概述 B:Scanner 的构造方法原理 Scanner(InputStream source) S...

    用户1289394
  • 四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?

    在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规...

    Java团长
  • API接口设计规范

    说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法...

    Java旅途
  • 四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?

    在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规...

    架构师修炼
  • 四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?

    说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法...

    芋道源码
  • 这样规范写代码,同事直呼“666”

    用户1516716
  • 这样规范写代码,同事直呼“666”

    Java团长

扫码关注云+社区

领取腾讯云代金券