翻译-Java字符串池

原文地址

正如名字所示:Java中字符串池存储在堆内存中。我们知道java中String是一个特殊的类,我们可以通过new 操作符或者使用双引号“”创建一个String对象。

  1. Java里的字符串池
  2. 字符串池中创建了多少字符串对象?

Java里的字符串池

下面是一个图,清晰的解释了java堆内存怎么管理字符串池的。以及当我们使用不同的方式创建字符串时发生了什么。

翻译-Java字符串池

字符串池是可行的,只是因为在Java中String是不可变类型的。而且它实现了字符串的interning 概念。

字符串池是享元设计模式的一个实例

字符串池有助于为Java运行时节省了很多的内存空间,即使它使用了更多的时间

当我们使用双引号创建字符串时,它首先在字符串池中寻找同样值的字符串,如果找到了就返回该引用。如果没找到,就在池中创建一个新的字符串并返回它的引用。

然而使用new操作符创建字符串时,我们强制String类在堆内存上创建一个新的String对象。我们可以使用intern() 方法将它放到String池中。或者指向字符串池中有相同值字符串对象的引用。

下面是java程序:

package com.journaldev.util;

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

推荐阅读: Java String Class

字符串池中创建了几个String对象呢?

有时候在Java面试中,你可能被问到关于字符串池的问题,比如,下面的语句创建了几个string.

String str = new String("Cat");

在上面的语句中,1个或者2个string被创建了,如果字符串池中已经有’cat‘字符串了,就只创建一个String.如果字符串池中没有’cat‘字符串,首先在字符串池中创建一个字符串,然后在堆内存中创建一个字符串,所有总共有2个string对象被创建了。

原文 

https://segmentfault.com/a/1190000021117763

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 翻译-Java字符串池

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址