相同的字符串比较返回错误结果

12

我有两个完全相同的字符串,一个在数组中,一个在字符串变量中。当我比较这些完全相同的字符串时,每次都会得到 false。我已经进行了反复调试,但每次都得到相同的结果。以下是相关的代码:

String temp = ""+(num1*num2);
Boolean equal = temp == answers[i];

if(equal) {
    correct[i] = true;
    num_correct ++;
}else{
    correct[i] = false;
}

我已经调试了这个程序的每一个细节,我101%确定这些字符串是相同的。为什么Java比较时返回false?


2
你为什么要使用 Boolean(Java 类)而不是本地的 boolean 类型?另外,为什么要使用 == 运算符而不是 equals() 方法? - SirDarius
1
我们需要一个前十的常见问题解答列表,因为“==”与“equals”混淆的情况经常出现。 - Steve Kuo
@Steve Kuo 那是个好主意。如果还没有的话,应该在元上建议一下。 - jdmichal
1
你为什么要给我点踩!在我接触的每一种编程语言中,"=="都适用于字符串。它不能工作的可能性甚至从未发生过在我的脑海里,也是许多其他程序员的想法。 - Hubro
5个回答

25
当您在Java中使用==运算符与对象进行比较时,您正在尝试比较对象引用。也就是说,这个对象句柄是否指向与另一个对象句柄完全相同的对象。除非字符串被池化,否则这样做将不起作用。请改用String.equals(Object)
Boolean equal = temp.equals(answers[i]);

不需要使用Boolean而不是boolean - Steve Kuo
1
只是按照 OP 中的写法陈述了一下。如果是我的话,我会使用“final boolean”。 - jdmichal

5

您正在进行引用比较,而不是值比较。当您使用 == 运算符时,它会检查引用是否相等,但它们并不相等。如果您想检查值是否相等,请使用 equals 方法。

boolean equal = temp.equals(answers[i]);

1

在Java中,字符串的“==”比较是用来判断它们是否为同一个对象,而不是比较它们的值。你应该使用“.equals”方法来比较它们的值。“==”有时候也可以工作,因为字符串可以被interned(即放入常量池)并通过引用指向同一个对象,即使它们是通过相同的字面量分别创建的(所以字符串b =“Hey”和字符串c =“Hey”最终在后台成为同一个对象,因为“Hey”被interned到了一个隐藏的字符串对象中)。


-1

正如其他人所示,您应该使用equals

但我还会使用Boolean对象的booleanValue

这是您正确完成的代码

String temp = ""+(num1*num2);
Boolean equal = temp.equals(answers[i]);

if(equal.booleanValue()) {
    correct[i] = true;
    num_correct ++;
}else{
    correct[i] = false;
}

可能是因为使用 Boolean.booleanValue 比 boolean 更复杂。 - DJClayworth
它将解包为基本布尔值。 - David
我不是使用布尔运算符的人。我只是使用和原帖作者相同的代码,但对其进行了改进。 - Shervin Asgari
@David:(un)Boxing非常昂贵。 - Shervin Asgari
这就是为什么他应该使用布尔值。但是,从调用booleanValue中你不会获得任何东西(除了更长的代码),因为这正是Java 5+编译器为您插入的内容。使用引用类型而不是基本类型会带来额外开销。 - David
我没有说这是一个好的踩,我只是解释了它。 - DJClayworth

-5

这有帮助吗?

Boolean equal = (temp == answers[i]);

我不确定那会不会成为一个问题,但我总是把我的条件括在括号里。


2
-1表示完全未解决问题。 - Erick Robertson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接