何时对字符串文本使用 intern()

2022-09-01 04:11:10

我看到很多像这样的遗留代码:

class A {
    public static final String CONSTANT = "value".intern();
    ...
}

我看不出有任何理由使用tern(),因为在Javadoc中,人们可以读到:“所有文本字符串和字符串值常量表达式都被禁产。也许在语言的过去修订中,是否有某种意图?


答案 1

这是一种确保它实际上不是常量的技术。CONSTANT

当 Java 编译器看到对最终静态基元或 String 的引用时,它会将该常量的实际值插入到使用它的类中。如果随后更改定义类中的常量值,但不重新编译 using 类,它将继续使用旧值。

通过在“常量”字符串上调用tern(),编译器不再将其视为静态常量,因此 using 类将在每次使用时实际访问定义类的成员。


JLS引用:


答案 2

使用常量字符串文本是浪费时间,因为文本将按照 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