什么是 Java 字符串池?
顾名思义,Java 中的字符串池是存储在Java 堆内存中的字符串池。我们知道 String 是 Java 中的特殊类,我们可以使用 new 运算符创建 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 String 类
字符串池中创建了多少个字符串?
有时在 Java 面试中,你会被问到有关字符串池的问题。例如,在下面的语句中创建了多少个字符串;
String str = new String("Cat");
在上面的语句中,将创建 1 或 2 个字符串。如果池中已经有一个字符串文字“Cat”,则只会在池中创建一个字符串“str”。如果池中没有字符串文字“Cat”,则将首先在池中创建它,然后在堆空间中创建它,因此总共将创建 2 个字符串对象。阅读:Java 字符串面试题