Java Strings何时实施?

Noe*_*l M 18 java string

受到关于这个问题的评论的启发,我很确定Java String是在运行时而不是编译时间实现的 - 当然,事实上可以在不同的时间编译类,但在运行时仍然会指向相同的引用.

我似乎无法找到任何证据支持这一点.谁能证明这一点?

Jon*_*eet 17

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

  • 如果对同一个字符串常量的两个引用出现在同一个类中,我希望该类文件只包含一个常量池条目.这并不是严格要求的,以确保String在JVM中只创建一个对象,但这是一个明显的优化.这实际上不是实际内容 - 只是不断优化.
  • 加载类时,类的字符串池将添加到实习池中.这是"真正的"实习生.

(我有一个模糊的回忆,Java 7围绕"小jar文件"的一部分工作包括整个jar文件的单个字符串池......但我可能是非常错误的.)

编辑:JVM规范的第5.1节,"运行时常量池"详细介绍了这个:

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

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

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