Java字符串实习生和文字

时间:2011-04-25 09:45:30

标签: java string literals

以下两段代码是否相同?

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

5 个答案:

答案 0 :(得分:14)

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

来自String#intern的两个相关引用:

  

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

     

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

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

答案 1 :(得分:4)

public String intern()

  

对于任何两个字符串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