以下两段代码是否相同?
String foo = "foo";
String foo = new String("foo").intern();
答案 0 :(得分:14)
它们具有相同的结果,但它们不相同(它们将产生不同的字节码; new String("foo").intern()
版本实际上经过这些步骤,产生一个新的字符串对象,然后实习它。)
来自String#intern
的两个相关引用:
当调用
intern
方法时,如果池已经包含等于String
方法确定的equals(Object)
对象的字符串,则返回池中的字符串。否则,将此String
对象添加到池中,并返回对此String
对象的引用。所有文字字符串和字符串值常量表达式都是实现的。
所以结果是相同的:引用实习字符串“foo”的变量。
答案 1 :(得分:4)
对于任何两个字符串s 和t,
s.intern() == t.intern()
是 当且仅当s.equals(t)
为真时才为真true
。
所以我认为答案是肯定的,尽管第二种方法必须在池中搜索。
修改强>
由T.J.提出。克劳德
调用实习方法时,如果 池已经包含一个字符串 等于这个String对象 由等于(对象)确定 方法,然后从池中的字符串 退回。否则,这个String 对象被添加到池中和 对这个String对象的引用是 返回。
所有文字字符串和字符串值 常数表达式被实习。
答案 2 :(得分:3)
第一个,即
String foo = "foo";
在这一行中,我们使用String文字创建一个String。这意味着字符串会自动保存在String Constant池中。
在第二个中,即 -
String foo = new String("foo").intern();
这里我们使用new String()&创建一个String。然后手动将其保存到String常量池。如果我们没有提到intern(),它就不会保存在String常量池中。
有关更多说明,请参阅此链接 -
http://javacodingtutorial.blogspot.com/2013/12/comparing-string-objects-intern-other.html
答案 3 :(得分:0)
是的,它们是一样的。基本上intern()
返回在VM上唯一的字符串表示。这意味着您可以使用==
代替.equals()
来比较字符串,从而节省性能。
答案 4 :(得分:0)
显式构造一个新的String 对象初始化为文字 产生一个非实习生 串。 (在此上调用intern() String将返回对该引用的引用 来自实习生表的字符串。)
取自:http://javatechniques.com/public/java/docs/basics/string-equality.html