在源代码中 com.sun.org.apache.xerces.internal.impl.XMLScanner第183和186行
183 protected final static String fVersionSymbol = "version".intern();
186 protected final static String fEncodingSymbol = "encoding".intern();
为什么“版本”和“编码”通过使用intern()显式实现,而它们是字符串文字,并会自动实现内嵌?
答案 0 :(得分:6)
我已将更改追溯到revision 318617 in the Apache Xerces SVN Repository(这是最初开发此XML解析器的项目,正如包名称所示)。
提交消息的相关部分是:
尝试改进符号表的使用。许多预定义的字符串都是 每次重置解析器时都会添加到符号表中。对于小文件, 这将是一笔巨大的成本。现在我们为字符串调用String #intern 在符号表中,将String #intern用于预定义的内容就足够了 符号。这只需要执行一次。
如您所述,.intern()
对于符合标准的JVM实现不应该是必要的(并且应该没有明显的效果)。
我猜是
在第二种情况下,我希望在评论或评论消息中注意到这一点。
.intern()
调用的一个副作用是初始值设定项不再是constant expressions,并且引用它们的其他类不会内联字段。这将确保类XMLScanner
加载并读取其字段。但是,我不认为这是相关的。
答案 1 :(得分:4)
我认为没有任何充分的理由,因为你确定了:文字总是自动实习,defined by the String
class:
所有文字字符串和字符串值常量表达式都是实体。字符串文字在The Java™Language Specification的3.10.5部分中定义。