Java String Pool是什么?

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

在Java中的字符串池

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

package com.Olivia.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类

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

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

String str = new String("Cat");

在上面的陈述中,将创建1个或2个字符串。如果字符串常量池中已经存在字符串“猫”,则只会在常量池中创建一个字符串“str”。如果常量池中不存在字符串常量“猫”,则首先会在常量池中创建该字符串,然后在堆空间中创建,因此总共会创建2个字符串对象。阅读:Java字符串面试问题。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds