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)
为true
,s.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()
来比较字符串,从而节省性能。