Java字符串实习生和文字

以下两段代码是否相同?

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

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

String#intern两个相关引用:

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

所有文字字符串和字符串值常量表达式都是实体。

所以最终结果是相同的:引用实习字符串“foo”的变量。

public String intern()

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

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

编辑

正如TJ Crowder所说

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

所有文字字符串和字符串值常量表达式都是实体。

第一个即

  String foo = "foo"; 

在这一行中,我们使用String文字创建一个String。 这意味着字符串会自动保存在String Constant池中。

在第二个,即 –

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

这里我们使用新的String()创建一个String,然后手动将其保存到String常量池。 如果我们没有提到intern(),它就不会保存在String常量池中。

有关更多说明,请参阅此链接 –

http://javacodingtutorial.blogspot.com/2013/12/comparing-string-objects-intern-other.html

显式构造一个初始化为文字的新String对象会产生一个非实体的String。 (在此String上调用intern()将返回对intern表中String的引用。)

摘自: http : //javatechniques.com/public/java/docs/basics/string-equality.html

是的,他们是一样的。 基本上, intern()返回在VM上唯一的字符串表示。 这意味着您可以使用==而不是.equals()来比较字符串,从而节省性能。