Java字符串池是什么?

正如名字所示,Java中的字符串池是存储在Java堆内存中的字符串池。我们知道,在Java中,String是一个特殊的类,我们既可以使用new运算符创建String对象,也可以在双引号中提供值来创建String对象。

Java中的字符串池

这是一张清楚解释了Java堆空间中如何维护字符串池,并且使用不同方式创建字符串时会发生什么的图表。字符串池的存在是因为Java中的字符串是不可变的,并且它实现了字符串池化的概念。字符串池也是享元设计模式的一个例子。字符串池可以帮助Java运行时节省大量的空间,尽管创建字符串的时间会更长。当我们使用双引号创建字符串时,它首先在字符串池中查找具有相同值的字符串,如果找到,则返回引用,否则在字符串池中创建一个新的字符串,然后返回引用。然而,使用new操作符,我们强制String类在堆空间中创建一个新的字符串对象。我们可以使用intern()方法将其放入字符串池中,或者引用字符串池中具有相同值的另一个字符串对象。以下是该字符串池图像的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字符串类

字符串池中创建了多少个字符串?

有时在Java面试中,你会被问到关于字符串池的问题。例如,在下面的语句中会创建多少个字符串;

String str = new String("Cat");

在上面的语句中,将创建1个或2个字符串。如果字符串池中已经存在一个字符串字面值“Cat”,那么只会在池中创建一个字符串“str”。如果字符串池中没有字符串字面值“Cat”,那么首先会在池中创建它,然后在堆空间中创建,因此总共会创建2个字符串对象。阅读: Java字符串面试问题

Source:
https://www.digitalocean.com/community/tutorials/what-is-java-string-pool