两个字符串及其引用的比较

时间:2011-11-07 20:47:00

标签: java string object

一方面;

String first = "thing";

String second = "thing";

if(first == second)

System.out.print( "Same things" );    //this is printed

另一方面;

String first = "thing";

String second = new String("thing");

if(first == second)
{
 System.out.print("Same things");
}
else
{
 System.out.print("Different things"); //This is printed
}

我知道" =="运算符用于比较两个对象的引用,但在第一个示例中,我直接比较了对象的值。我知道这种比较是不准确的。但为什么我在第一个例子中得到消息?它是指示引用是相同的,还是由巧合发生的?

6 个答案:

答案 0 :(得分:3)

在第一个示例String pool中使用

- 如果不使用new关键字 - 每个新的String实例都会在该池上登陆,如果创建了具有相同值的String,则没有新对象是制作 - 正在使用游泳池中的那个。

答案 1 :(得分:0)

我认为Java是通过缓存使用此方法创建的字符串来优化的:

String second = "thing";

因此使他们“平等”。

这样做时:

String second = new String("thing");

您明确地使用这些内容分配新字符串,这会使您的if条件成为错误。

答案 2 :(得分:0)

String first = "thing";

String second = new String("thing");

if(first.equals(second))
{
 System.out.print("Same things");
}
else
{
 System.out.print("Different things"); //This is printed
}

这应该可行。

答案 3 :(得分:0)

在第一个示例中,Java将完全相同的对象分配给第一个和第二个。

在第二个例子中,Java正在创建一个新的Object'second'(内部指向第一个)。所以你拥有的是第一个和第二个的两个字符串对象,但第二个内部包含对第一个的引用。

请参阅String#intern()的文档。从那以后:

  

返回字符串对象的规范表示。一池水   最初为空的字符串由String类私有维护。

     

当调用实习方法时,如果池已包含   字符串等于此字符串对象由equals(Object)确定   方法,然后返回池中的字符串。否则,这个   String对象被添加到池中以及对此String的引用   返回对象。

     

对于任何两个字符串s和t,s.intern()== t.intern()   当且仅当s.equals(t)为真时才为真。

     

所有文字字符串和字符串值常量表达式都是   实习。字符串文字在Java Language Specification

的§3.10.5中定义

答案 4 :(得分:0)

首先,firstsecond具有相同的参考。

但是在第二种情况下,它们有不同的参考。

使用==,您实际上是在比较变量firstsecond中的值,它们是对字符串对象的引用。您不是在比较对象本身。使用equals方法可以完成。

答案 5 :(得分:0)

字符串文字是interned您还可以使用

获取消息
String first = "thing";

String second = new String("thing");

if(first.intern() == second.intern())
{
 System.out.print("Same things"); //This is printed
}
else
{
 System.out.print("Different things");
}