首页 > Java > java教程 > 为什么即使常量池中存在对同一文字的引用,Java 仍会创建一个新的字符串对象?

为什么即使常量池中存在对同一文字的引用,Java 仍会创建一个新的字符串对象?

DDD
发布: 2024-11-03 07:26:02
原创
615 人浏览过

Why Does Java Create a New String Object Even When a Reference to the Same Literal Exists in the Constant Pool?

Java 字符串常量池:实习和引用相等

简介:

字符串常量池是Java 虚拟机 (JVM),用于存储常量值,包括字符串文字。当 JVM 在编译期间遇到字符串文字时,它会检查池中是否存在具有相同值的现有字符串。如果找到,对新文字的引用将定向到现有字符串,从而避免创建新实例。

使用“new”关键字进行实习:

但是,在创建新的 String 对象时使用“new”关键字会引入不同的行为,如所提供的参考文献中所述。虽然对 String 文字(在本例中为“test”)的引用仍将放置在池中,但 JVM 有义务在运行时创建一个新的 String 对象,而不是重用池中的对象。

问题:

如果池中对字符串文字的引用与使用“new”创建时相同,那么 JVM 不应该返回现有引用而不是创建新引用?

答案:

不,当使用“new”运算符时,JVM 不会返回现有引用。相反,它将创建一个新的 String 对象并将其分配给由“new”关键字创建的引用。这是因为:

  • 文字实习: 当编译器遇到字符串文字“test”时,它会检查池中是否存在相同的字符串。由于没有,会创建一个值为“test”的新 String 对象并将其放入池中。
  • 使用“new”构造对象:当您创建一个新 String 时使用“new String(literal)”对象时,对文字(“test”)的引用将传递给构造函数。这意味着构造函数中的引用与池中的文字具有相同的值。
  • 新对象创建:但是,“new”运算符指示 JVM 创建一个新的 String目的。这个新对象与存储在池中的对象是不同的实例,即使它们引用相同的文字值。

示例:

在此示例中,“literal”和“two”引用指向池中的同一个 String 对象。然而,“one”引用指向“new”创建的另一个 String 对象。因此,使用“==”进行相等比较将返回 false。

澄清:

语句“当编译器遇到字符串文字时,它会检查池以查看如果相同的字符串已存在”应解释为“在池中”,这意味着只有已被保留或显式添加到池中的字符串文字才会被考虑进行保留。

以上是为什么即使常量池中存在对同一文字的引用,Java 仍会创建一个新的字符串对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板