字符串a,b:if(a.equals(b)),if(Objects.equals(a,b))或if(a..hashCode()== b.hashCode())?

时间:2018-04-21 17:53:12

标签: java android

对于字符串(String a; String b;)有什么好处:if(Objects.equals(a, b))if(a.hashCode()==b.hashCode())

我使用if(Objects.equals(a, b))用于Android API> = 19和if(a.hashCode()==b.hashCode())用于Android API< 19,但我不记得为什么......

5 个答案:

答案 0 :(得分:3)

您可以阅读by checking the class Object documentation here

  

如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。

这意味着即使a.hashCode()== b.hashCode()为真,也不一定意味着a.equals(b)为真。

对于对象比较,您应该始终依赖于equals方法。对于任何类型的Object都是如此,除非您有一些非常特殊的需求,而且不仅仅适用于Strings。

编辑:正如评论中指出的那样,

  

hashCode可以为两种完全不同类型的对象返回相同的内容

答案 1 :(得分:0)

使用Equals更加真实(在语义和惯例方面)。无需采取额外行动。正如你可以在equals的源代码中那样可以比较对象是相同的。

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}

答案 2 :(得分:0)

String有自己的 equals() equalsIgnoreCase()版本。使用它们,

答案 3 :(得分:-1)

它在Javadoc for Object.hashCode

中说明
  

支持此方法是为了哈希表的优势,例如HashMap提供的哈希表。

如果您没有构建哈希表,使用hashCode几乎肯定不是正确使用的方法。

您实际上并未描述过您要执行的操作,但Objects.equals(a, b)a.hashCode() == b.hashCode()不可替代。

例如,Objects.equals("AA", "Ab")为false,但"AA".hashCode() == "Ab".hashCode()为真。

答案 4 :(得分:-1)

我使用if(Objects.equals(a, b))代替if(a.equals(b))因为检查

  

在国际化语境中调用的'String.equals()'报告任何调用   等于() equalsIgnoreCase() compareTo() compareToIgnoreCase()   在字符串对象上。这样的电话通常是不正确的   国际化环境。

我将if(a.hashCode()==b.hashCode())用于API< 19而不是if(Objects.equals(a, b)),因为检查

  

调用需要API级别19(当前最小值为14):   java.util.Objects#等号