自动实习字符串文字

时间:2012-11-02 14:10:56

标签: java string

在源代码中 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()显式实现,而它们是字符串文字,并会自动实现内嵌?

2 个答案:

答案 0 :(得分:6)

我已将更改追溯到revision 318617 in the Apache Xerces SVN Repository(这是最初开发此XML解析器的项目,正如包名称所示)。

提交消息的相关部分是:

  

尝试改进符号表的使用。许多预定义的字符串都是   每次重置解析器时都会添加到符号表中。对于小文件,   这将是一笔巨大的成本。现在我们为字符串调用String #intern   在符号表中,将String #intern用于预定义的内容就足够了   符号。这只需要执行一次。

如您所述,.intern()对于符合标准的JVM实现不应该是必要的(并且应该没有明显的效果)。

我猜是

  • 作者不知道字符串文字将始终被实习
  • 这是一个有意识的决定,以防止行为不端的JVM实施

在第二种情况下,我希望在评论或评论消息中注意到这一点。

.intern()调用的一个副作用是初始值设定项不再是constant expressions,并且引用它们的其他类不会内联字段。这将确保类XMLScanner加载并读取其字段。但是,我不认为这是相关的。

答案 1 :(得分:4)

我认为没有任何充分的理由,因为你确定了:文字总是自动实习,defined by the String class

  

所有文字字符串和字符串值常量表达式都是实体。字符串文字在The Java™Language Specification的3.10.5部分中定义。