一尘不染

Java字符串何时被冻结?

java

受到关于这个问题)的评论的启发,我很确定Java
String在运行时而不是在编译时就被内生了—当然,事实是类可以在不同的时间进行编译,但仍会在运行时指向相同的引用。

我似乎找不到任何证据来支持这一点。谁能证明这一点?


阅读 192

收藏
2020-09-08

共1个答案

一尘不染

优化在两个地方都发生(或至少可以发生):

  • 如果对同一字符串常量的两个引用出现在同一类中,则我希望该类文件仅包含一个常量池条目。为了确保在JVM中仅创建一个对象,并非严格 要求 这样做String,但这显然是一种优化。实际上,这实际上不是内部的-只是不断的优化。
  • 加载类时,该类的字符串池将添加到内部池中。这是“真实的”实习。

(我有一个模糊的回忆,Java 7围绕“小型jar文件”所做的工作之一包括为整个jar文件提供一个字符串池……但是我可能错了。)

编辑:JVM规范的第5.1节“运行时常量池”详细介绍了这一点:

为了派生字符串文字,Java虚拟机检查由CONSTANT_String_info结构给出的字符序列。

* 如果先前在String类的实例上调用了String.intern方法,该实例包含与CONSTANT_String_info结构所给定的Unicode字符序列相同的字符串,则字符串文字派生的结果是对该类String的该实例的引用。

* 否则,将创建一个新的String类实例,其中包含由CONSTANT_String_info结构给出的Unicode字符序列;该类实例是字符串文字派生的结果。最后,新的String实例的intern方法被调用。

2020-09-08