Java 字符串内联和文本
以下两段代码是否相同?
String foo = "foo";
String foo = new String("foo").intern();
以下两段代码是否相同?
String foo = "foo";
String foo = new String("foo").intern();
它们具有相同的最终结果,但它们并不相同(它们将产生不同的字节码;版本实际上会经历这些步骤,生成一个新的字符串对象,然后进行实习)。new String("foo").intern()
两个相关引用自:String#intern
调用该方法时,如果池中已包含与该方法确定的此对象相等的字符串,则返回池中的字符串。否则,此对象将添加到池中,并返回对此对象的引用。
intern
String
equals(Object)
String
String
所有文本字符串和字符串值常量表达式都将被暂存。
因此,最终结果是相同的:一个引用滞留字符串“foo”的变量。
因此,对于任何两个字符串 s 和 t,当且仅当 为 时,才为 真。
s.intern() == t.intern()
s.equals(t)
true
所以我相信答案是肯定的,尽管第二种方法必须通过池进行搜索。
编辑
正如T.J. Crowder所暗示的那样
调用 intern 方法时,如果池中已包含由 equals(Object) 方法确定的与此 String 对象相等的字符串,则返回池中的字符串。否则,此 String 对象将添加到池中,并返回对此 String 对象的引用。
所有文本字符串和字符串值常量表达式都将被暂存。