受到关于这个问题)的评论的启发,我很确定Java String在运行时而不是在编译时就被内生了—当然,事实是类可以在不同的时间进行编译,但仍会在运行时指向相同的引用。
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方法被调用。
为了派生字符串文字,Java虚拟机检查由CONSTANT_String_info结构给出的字符序列。
* 如果先前在String类的实例上调用了String.intern方法,该实例包含与CONSTANT_String_info结构所给定的Unicode字符序列相同的字符串,则字符串文字派生的结果是对该类String的该实例的引用。
* 否则,将创建一个新的String类实例,其中包含由CONSTANT_String_info结构给出的Unicode字符序列;该类实例是字符串文字派生的结果。最后,新的String实例的intern方法被调用。