Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串文本的自动暂存_Java_String - Fatal编程技术网

Java 字符串文本的自动暂存

Java 字符串文本的自动暂存,java,string,Java,String,在源代码中 在第183行和第186行 183 protected final static String fVersionSymbol = "version".intern(); 186 protected final static String fEncodingSymbol = "encoding".intern(); 为什么“version”和“encoding”是通过使用intern()显式地进行内部调用的,而它们是字符串文本并将自动进行内部调用?我不相信有什么好的理由,

在源代码中 在第183行和第186行

183    protected final static String fVersionSymbol = "version".intern();

186    protected final static String fEncodingSymbol = "encoding".intern();

为什么“version”“encoding”是通过使用intern()显式地进行内部调用的,而它们是字符串文本并将自动进行内部调用?

我不相信有什么好的理由,因为您确定的原因:文本总是自动进行内部调用,如下所示:

所有文字字符串和字符串值常量表达式都被插入。字符串文本是在Java的第节中定义的™ 语言规范


我已经跟踪到了对的更改(正如包名所示,这是XML解析器最初开发的项目)

提交消息的相关部分是:

试图改进符号表的使用。许多预定义的字符串是 每次重置解析器时都会添加到符号表中。对于小型文件, 这将是一个巨大的成本。既然我们称字符串为“字符串的实习生” 在符号表中,对于那些预定义的符号,使用字符串#intern就足够了 符号。这只需要执行一次

正如您所指出的,
.intern()
对于一致性JVM实现来说应该是不必要的(并且应该没有明显的影响)

我猜是这样

  • 要么作者没有意识到字符串文本总是被拘留的事实
  • 或者,这是一个有意识的决定,以防范行为不端的JVM实现
然而,在第二种情况下,我希望在评论或评论消息中能注意到这一点


调用
.intern()
的一个副作用是不再使用初始值设定项,字段也不会被引用它们的其他类内联。这将确保加载类
XMLScanner
,并读取其字段。然而,我认为这与此无关。

那么这是一个糟糕编码的例子吗?@aLearner:我想是吧。我可能不会说得那么强烈,但至少如果有很好的理由这样做(我对此表示怀疑),我希望得到一个评论来解释这是什么。+1个好问题!效果是相同的,但是使用和不使用生成的字节码是不同的。我想我们永远不会知道,除非我们直接问作者,这样就无法回答。我想说这是过早的优化。从提交消息:
…每次重置解析器时,许多预定义字符串都会添加到符号表中…现在,因为我们为符号表中的字符串调用String#intern。。。对于那些预定义的符号,使用String#intern就足够了。这只需要执行一次。
——很明显,每当解析器被重置时,作者不希望一次又一次地将预定义的字符串符号从代码中添加到符号表中。所以,作者很可能并没有意识到字符串文本会自动被截取。