何时对字符串文本使用 intern()
我看到很多像这样的遗留代码:
class A {
public static final String CONSTANT = "value".intern();
...
}
我看不出有任何理由使用tern(),因为在Javadoc中,人们可以读到:“所有文本字符串和字符串值常量表达式都被禁产。也许在语言的过去修订中,是否有某种意图?
我看到很多像这样的遗留代码:
class A {
public static final String CONSTANT = "value".intern();
...
}
我看不出有任何理由使用tern(),因为在Javadoc中,人们可以读到:“所有文本字符串和字符串值常量表达式都被禁产。也许在语言的过去修订中,是否有某种意图?
这是一种确保它实际上不是常量的技术。CONSTANT
当 Java 编译器看到对最终静态基元或 String 的引用时,它会将该常量的实际值插入到使用它的类中。如果随后更改定义类中的常量值,但不重新编译 using 类,它将继续使用旧值。
通过在“常量”字符串上调用tern(),编译器不再将其视为静态常量,因此 using 类将在每次使用时实际访问定义类的成员。
JLS引用:
使用常量字符串文本是浪费时间,因为文本将按照 3.10.5 节的规定进行暂存。字符串的 Java® 语言规范。intern()
引用自 Java SE 8 版本:
此外,字符串文本始终引用类 String 的同一实例。这是因为字符串文本 (或者更一般地说,作为常量表达式的值的字符串 (§15.28) ) 被“暂存”,以便使用 String.intern 方法共享唯一实例。
我猜程序员没有意识到这个事实。
编辑:
正如kdgregory所指出的那样,这个常数的内联方式有影响。
1- https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5