Java string.equals(string)表现不如预期

时间:2013-09-11 09:47:11

标签: java android eclipse string equals

我偶尔会收到String.equals(String)的奇怪结果。

这是代码:

boolean equals(OutputHolder other){
    boolean result=true;
    if( ! this.speciesEng.equals(other.speciesEng))
        result=false;
    else if( ! this.date.equals(other.date))
        result=false;
    else if( ! this.gridRef.equals(other.gridRef))
        result=false;
    else if( ! this.recorder.equals(other.recorder))
        result=false;
    return result; 
}

所有这些都非常直接,但在某些对象上.equals()在看似2个相同的字符串时返回false。

这是错误发生时Expressions监视列表的屏幕截图。你可以看到this.speciesEng.equals(other.speciesEng)返回false,尽管两个字符串看起来都是一样的。

字符串最初来自相同的字符串资源,但两者都通过XMPP连接并返回。

编辑:要通过XMPP连接传递它们,它们已与其他字符串连接以表示整个OutputHolder。然后使用.substring(start,end)返回它们。在我看来,如果我从子字符串中创建一个新字符串但它没有任何效果,它可能会有所不同。也没有修剪它们。

我对如何继续调试问题感到茫然。欢迎任何帮助或建议。

5 个答案:

答案 0 :(得分:2)

确保没有尾随空格。因此,在使用trim方法进行比较之前,最好在字符串上使用equals方法。

答案 1 :(得分:2)

那里可能有一些空白。在调用equals之前使用String#trim方法。

答案 2 :(得分:1)

我认为你应首先trim两个字符串并删除额外的空格 这样,您就可以正确地等同Strings

示例代码:

String yourString = "Your String   ";
//Trim the String and get rid of extra spaces before doing any comparisons.
yourString.trim();
//After trimming it, do the comparisons.
if(yourString.equalsIgnoreCase("other trimmed string"))
{
 .....
}


我希望这会有所帮助。

答案 3 :(得分:0)

boolean equals(OutputHolder other){
boolean t1 = speciesEng.equals(other.speciesEng);
boolean t2 = date.equals(other.date);
boolean t3 = gridRef.equals(other.gridRef);
boolean t4 = recorder.equals(other.recorder);
return t1 && t2 && t3 && t4;

}

答案 4 :(得分:0)

在上帝知道从调试器复制和粘贴多少小时到十六进制编辑器后,我发现了问题和一个有效的解决方案。

正如所建议的那样,问题是空白,但不是我或(我认为)其他人怀疑的方式。 由于某种原因,我未能深究,我在我的字符串中得到了不间断的空格(0x00A0)而不是普通的空格(Ox0020)。这似乎或多或少随机发生,我还没有找到负责的代码部分。

目前的工作是用以下方法启动我的equals()方法:

    speciesEng=speciesEng.replace((char)0x00a0,(char)0x0020);
    other.speciesEng=other.speciesEng.replace((char)0x00a0,(char)0x0020);
    speciesEng=speciesEng.trim();
    other.speciesEng=other.speciesEng.trim();

远非优雅,但它暂时起作用。如果有人有更多要补充的话,我会将问题保持开放几天。

感谢大家的回答。