深入解析 Java 中的 字符串池 (String Pool)
之前有听说过“Java 中的字符串池(String Pool)”这个术语吗? 好吧,如果没有,那么这篇文章将帮助你来了解它。 Java中的字符串池是存储在Java堆内存中的字符串池。 让我们再深入一点,详细了解一下Java String pool
这个概念。
本文将讨论以下几点:
- 如何创建字符串?
- Java中的字符串池是什么?
- 字符串池在 Java 中是如何工作的?
- 流程图
- 字符串池的Java程序
好了,下面让我们开始吧!
如何创建字符串
首先,让我们了解一个字符串对象是如何创建的!
在 Java 中创建 String 对象有两种方法:
-
使用 new 运算符。 例如,
String s1 = new String("Jiyik");
-
使用字符串文字或常量表达式。 例如,
String s1="Jiyik"; // (string 文本) 或者 String s1="jiyik" + ".com"; // (string 常量表达式)
现在,我正在谈论的这个字符串池是什么,以及如何在 Java 中创建与此相关的字符串。
Java中的字符串池是什么?
字符串池是 Java 堆中的一个存储区域。
与所有对象分配一样,字符串分配在时间和内存方面都被证明是一项代价高昂的事情。 JVM 在初始化字符串文本时执行一些步骤以提高性能并减少内存开销。 为了减少在 JVM 中创建的 String 对象的数量,String 类保留了一个字符串池。
每次创建字符串文字时,JVM 首先检查字符串文本池。 如果字符串已存在于字符串池中,则返回对池实例的引用。 如果池中不存在字符串,则初始化一个新的 String 对象并将其放入池中。
在理论上了解了这个概念之后,让我通过简单的实例一步步告诉你Java中字符串池(String pool)是如何工作的!
字符串池在 Java 中是如何工作的?
当我们创建这样的新字符串时:
String s1 = “Jiyik”
JVM 会自动检查字符串常量池中是否存在相同的值。
- 如果存在,它会引用已经存在的值。
- 如果不存在,它会自行创建一个新字符串并将其添加到字符串池中。
如果想停止这种行为,需要使用 new
运算符创建一个字符串:
String s1 = new String(“jiyik.com”)
现在,如果愿意将此字符串添加到字符串池中,Java 为我们提供了一个名为 intern()
的方法; 我们可以像这样调用本机 intern()
方法:
S1.intern();
现在,我们将通过一个示例来展示字符串池的实现和工作。
但在此之前,一个简短的提醒!
如我们所知,如果使用
==
运算符比较 2 个对象,它会比较内存中的地址。
所以我们将使用 ==
比较字符串以完全确定它是否是同一个对象。
现在,让我们进入我们的过程。
流程图

现在让我们一步一步看一下这里发生什么:
- 调用 JVM 时加载该类。
- JVM 查找程序中的所有字符串文本
- 首先,它找到引用文字“Jiyik”的变量 s1 并在内存中创建它
- 然后将文本“Jiyik”的引用放置在字符串常量池内存中。
- 然后它找到另一个变量 s2,它引用了相同的字符串文本“Google”。
- 然后它找到另一个变量 s3,它指向的是文本“Jiyik”
- 现在 JVM 已经找到了字符串文本“Jiyik”,变量 s1 和 s3 都将引用同一个对象,即“Jiyik”。
字符串池示例
下面我们来看一段字符串池(String Pool)的代码示例:
public class StringPoolExperiment {
public static void main(String[] args) {
String s1 = "Jiyik";
String s2 = "Jiyik";
String s3 = new String("Jiyik");
String s4 = new String("Jiyik").intern();
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s1 == s4); // true
}
}
上面代码运行结果如下
true
false
true
在上面的例子中,我们可以清楚地看到字符串初始化在这三种方式中的使用; 例如:
String s1 = "Jiyik";
String s2 = "Jiyik";
String s3 = new String("Jiyik");
String s4 = new String("Jiyik").intern();
程序的内部工作原理也许现在应该清楚了。
相关文章
Do you understand JavaScript closures?
发布时间:2025/02/21 浏览次数:108 分类:JavaScript
-
The function of a closure can be inferred from its name, suggesting that it is related to the concept of scope. A closure itself is a core concept in JavaScript, and being a core concept, it is naturally also a difficult one.
Do you know about the hidden traps in variables in JavaScript?
发布时间:2025/02/21 浏览次数:178 分类:JavaScript
-
Whether you're just starting to learn JavaScript or have been using it for a long time, I believe you'll encounter some traps related to JavaScript variable scope. The goal is to identify these traps before you fall into them, in order to av
How much do you know about the Prototype Chain?
发布时间:2025/02/21 浏览次数:150 分类:JavaScript
-
The prototype chain can be considered one of the core features of JavaScript, and certainly one of its more challenging aspects. If you've learned other object-oriented programming languages, you may find it somewhat confusing when you start
如何在 JavaScript 中合并两个数组而不出现重复的情况
发布时间:2024/03/23 浏览次数:86 分类:JavaScript
-
本教程介绍了如何在 JavaScript 中合并两个数组,以及如何删除任何重复的数组。