String Pool in Java2025 年 3 月 27 日 | 阅读 5 分钟 在 Java 中,String 是最重要的主题。与 String 相关有很多概念,而 **字符串常量池概念** 是其中之一。 **Java 中的字符串常量池概念** 有点棘手。因此,在本节中,我们将讨论 **字符串常量池** 或 **字符串驻留概念**。 什么是字符串常量池?字符串常量池 是 Java 堆 中用于存储字符串字面量的一个存储区域。它也称为 **字符串驻留池** 或 **字符串常量池**。它就像对象分配一样。默认情况下,它是空的,并由 **Java String** 类私有维护。每当我们创建一个字符串时,该字符串对象就会占用堆内存中的一些空间。创建大量字符串可能会增加成本和内存占用,从而降低性能。 JVM 在初始化字符串字面量时会执行一些步骤,这些步骤可以提高性能并减少内存负载。为了减少 JVM 中创建的 String 对象的数量,String 类会维护一个字符串池。 当我们创建一个字符串字面量时,JVM 首先在字符串池中检查该字面量。如果字面量已存在于池中,它将返回池中实例的引用。如果字面量不存在于池中,则会创建一个新的 String 对象并将其放入字符串池中。 在 Java 中创建 String在 Java 中创建 String 有两种方式: 使用字符串字面量String str1 = "Python"; String str2 = "Data Science"; String str3 = "Python"; 使用 new 关键字在 Java 中,还可以使用 new 关键字 创建 String,如下所示: String str1 = new String ("Java"); String str2 = new String ("C++"); String str3 = new String ("Data Science"); 让我们了解它们之间的区别。让我们比较字符串字面量的引用。 s1==s3 //true s2==s3 //false 让我们看看我们是如何发现相等与否的。 ![]() 首先,我们创建了一个字符串字面量 **Python**,它占用了字符串池中的一个位置。之后,创建了字符串 **Data Science**,它也占用了字符串池中的一个位置。最后,我们再次创建了字符串 **Python**。但这次,JVM 检查字符串,发现该字符串字面量已存在。它不会在字符串池中创建新的实例,而是返回池中实例的引用,即 **str1**。 同样,当我们使用 new 关键字创建字符串字面量时,它们也会放入字符串池中。我们创建了三个字符串字面量 **Java, C++,** 和 **Data Science**。我们看到字符串字面量 Java 和 C++ 是新创建的。但是 **Data Science** 字面量已经存在于池中。此时,JVM 为 Java 堆中的字面量 **Data Science** 分配空间。请记住,所有使用 new 关键字创建的字符串字面量都放在 Java 堆中,而不是字符串常量池中。 StringPoolExample.java 输出 ![]() 在上面的示例中,我们看到每当我们使用 **new** 运算符创建字符串时,它都会在 Java 堆中创建一个新的字符串对象。我们可以通过使用 String 类的 **intern()** 方法来强制阻止此功能。 Java String.intern() 方法**String.intern()** 方法会将字符串放入字符串常量池,或引用字符串常量池中具有相同值的另一个 String 对象。如果字符串常量池已包含与 String 对象值相等的字符串,则它会返回池中的字符串。它通过使用 **String.equals(Object)** 方法来确定字符串。如果字符串不存在,则将 String 对象添加到池中,并返回对该 String 对象的引用。 对于任何两个字符串 str1 和 str2,当且仅当语句 **str1.equals(str2)** 为 true 时,**str1.intern() == str2.intern()** 才为 true。 注意:所有字面量字符串和字符串值的常量表达式都会被驻留。语法 该方法返回字符串对象的规范表示。 例如 上述语句会在 Java 堆中创建字符串。如果我们要将字符串字面量存储在字符串常量池中,则应使用 intern() 方法。 让我们看一个例子,了解 intern() 方法的用法。 StringInternExample.java 输出 ![]() 注意事项在处理 String 时,需要牢记有关字符串驻留和字符串常量池的以下几点:
|
按日期对数据进行分组是软件开发中的一项常见任务,尤其是在处理大型数据集时。Java 提供了一个强大的功能,称为 Group by 子句,用于按特定列或字段对数据进行分组。在本文中,我们将讨论如何使用...
5 分钟阅读
? 在 C 和 C++ 等编程语言中,在函数或变量的实际实现之前,需要前向声明来通知编译器它的存在。这有助于在单独的文件中组织代码和解决依赖关系。然而,Java 由于...而以不同的方式处理这个问题。
阅读 3 分钟
在 Java 中,Dictionary 是键值对列表。我们可以使用 Java Dictionary 类在字典中存储、检索、删除、获取和放置值。在本节中,我们将讨论 Java Dictionary 类,它像...
阅读 4 分钟
书籍是学生最好的朋友,在教育方面没有什么能比得上书籍。这就是为什么大多数经验丰富的 Java 程序员都推荐阅读书籍来学习 Java 编程语言。书籍包含深入而真实的知识。在这...
7 分钟阅读
在 Java 中,不可变列表是指一旦创建就无法修改的列表。尝试在列表创建后添加、删除或修改元素将引发异常。使用不可变列表的主要好处是它们提供了线程...
11 分钟阅读
在本节中,我们将讨论如何在 Java 中将矩阵旋转 180 度。在这个问题中,给出了一个方形矩阵,我们需要将其旋转 1800 度。示例 1:输入:4 6 7 8 9 3 2 1 9 0 4 5 8 0 3 2 输出:2 3...
阅读 10 分钟
图像处理是一项基本技术,它使计算机能够分析、操作和解释视觉信息。从增强照片到实现高级计算机视觉应用,图像处理在现代技术中起着至关重要的作用。Java 凭借其强大的库和框架,为...
阅读 6 分钟
在计算数学和算法问题解决领域,一项常见的任务是处理和分析矩阵。一个有趣的问题涉及找到一个二维矩阵中心到零(0)的最远距离。这个任务不仅展示了数学的优雅...
阅读 4 分钟
? 在 Java 中,线程可以分为守护线程和非守护线程(用户线程)。非守护线程是 Java 虚拟机(JVM)在关闭之前等待完成的典型线程,而守护线程是后台线程,它们不会阻止 JVM 在...时退出。
5 分钟阅读
valueOf() 方法是一个静态方法,它返回保持传递参数值的相应 Integer 对象。参数可以是基本数据类型、String 等。Java 的 valueOf() 函数是映射不同数据类型(如字符串和...)的重要工具。
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India