当前位置: 首页 > 面试题库 >

何时在字符串文字上使用intern()

昌正奇
2023-03-14
问题内容

我看到很多这样的旧代码:

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

我看不到使用intern()的任何原因,因为在Javadoc中可以看到:“所有文字字符串和字符串值常量表达式都被插入。”
是否有此意图,也许是在该语言的过去版本中?


问题答案:

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

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

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

JLS引文:

  • 编译时常量的定义:http : //docs.oracle.com/javase/specs/jls/se6/html/expressions.html#5313

  • 隐含对编译时常量的更改(大约在页面的一半):http : //docs.oracle.com/javase/specs/jls/se6/html/binaryComp.html#45139



 类似资料:
  • 问题内容: 我只是在整理我的代码而已,这是一段: 然后我想到了另一种方法来摆脱检查: 绝对可以,但是 这样 做 安全 吗?我的意思是字符串文字存储在公共池中,而字符串对象create by 在堆上。但是常量池中的字符串也是对象,对吗? 但是,尽管它使代码更短,但这似乎仍然不是正确的选择。 问题答案: 这是安全的-并且如您所见,这是避免空指针的一种好方法。 您提到了for字符串的使用。许多Java静

  • 问题内容: 给我 : 我想打印输出: 问题答案: 你需要将{{和加倍}}: 这是Python文档中有关格式字符串语法的相关部分: 格式字符串包含用花括号括起来的“替换字段” 。花括号中不包含的所有内容均视为文字文本,该文本原样复制到输出中。如果需要在文字文本中包含大括号字符,可以通过加倍:{{和来对其进行转义。

  • 我试图创建一个表示JSON对象数组的字符串文字,所以我想到了使用字符串插值特性,如下面的代码所示: 现在我想使用逐字字符串,这样我就不必使用反斜杠来转义双引号。因此,通过这个答案,我了解到逐字字符串和字符串插值可以一起使用。所以我改变了我的代码如下: 但它无法编译。如果我的用法有任何错误,或者在这种情况下无法使用C#的逐字字符串功能转义双引号,有人能帮我吗?

  • 问题内容: 在我的应用程序中,我将经常传递对静态字符串的引用。我希望避免让Go为每个调用分配内存,但是我无法将地址获取到字符串文字。 为什么不能采用字符串文字的地址(请参见下面的示例)?我是否误解了语法,还是由于Go的内部运作而受到限制? 如果不可能的话,最好的解决方案是什么? 可以,但是每次都会分配内存吗? 不会分配任何新的内存,但我希望避免该函数之外的混乱情况。 感谢帮助! 问题答案: 接受文

  • 当我有一个字符串需要将一个字符连接到它的结尾时,我应该更喜欢超过是否有任何性能原因? 我知道数组字符串连接和字符串生成器,我并不是在询问一般情况下如何连接字符串的建议。 我也知道有些人会有冲动向我解释过早的优化,而且一般来说我不应该为这些小事情费心,请不要... 我之所以问这个问题,是因为从编码风格的偏好来看,我更倾向于使用后一个,但我觉得第一个应该表现得稍微好一点,因为知道所附加的只是一个字符,

  • 当我们使用 String 文字创建字符串对象时,会调用字符串类的哪个构造函数。 示例: 在这种情况下,string类的哪个构造函数get?