Java 字符串内联和文本

2022-09-04 01:24:43

以下两段代码是否相同?

String foo = "foo";
String foo = new String("foo").intern();

答案 1

它们具有相同的最终结果,但它们并不相同(它们将产生不同的字节码;版本实际上会经历这些步骤,生成一个新的字符串对象,然后进行实习)。new String("foo").intern()

两个相关引用自:String#intern

调用该方法时,如果池中已包含与该方法确定的此对象相等的字符串,则返回池中的字符串。否则,此对象将添加到池中,并返回对此对象的引用。internStringequals(Object)StringString

所有文本字符串和字符串值常量表达式都将被暂存。

因此,最终结果是相同的:一个引用滞留字符串“foo”的变量。


答案 2

public String intern()

因此,对于任何两个字符串 s 和 t,当且仅当 为 时,才为 真。s.intern() == t.intern()s.equals(t)true

所以我相信答案是肯定的,尽管第二种方法必须通过池进行搜索。

编辑

正如T.J. Crowder所暗示的那样

调用 intern 方法时,如果池中已包含由 equals(Object) 方法确定的与此 String 对象相等的字符串,则返回池中的字符串。否则,此 String 对象将添加到池中,并返回对此 String 对象的引用。

所有文本字符串和字符串值常量表达式都将被暂存。