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

Java 字符串a,b:if(a.equals(b)),if(Objects.equals(a,b))或if(a..hashCode()==b.hashCode())?,java,android,Java,Android,什么对字符串a更好;字符串b;:ifObjects.equalsa、b或ifa.hashCode==b.hashCode 我用ifObjects.equalsa,b表示Android API>=19,用ifa.hashCode==b.hashCode表示Android API

什么对字符串a更好;字符串b;:ifObjects.equalsa、b或ifa.hashCode==b.hashCode

我用ifObjects.equalsa,b表示Android API>=19,用ifa.hashCode==b.hashCode表示Android API<19,但我不记得为什么…

,正如你所看到的

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

这意味着即使a.hashCode==b.hashCode为true,也不一定意味着a.equalsb为true

对于对象比较,应始终使用equals方法。这适用于任何类型的对象,除非您有一些非常特殊的需要,而不仅仅是字符串

编辑:正如评论中指出的

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


从语义和惯例的角度来看,使用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;
}
它在报告中指出:

支持此方法是为了使用哈希表,例如HashMap提供的哈希表

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

实际上,您还没有描述要执行的操作,但是Objects.equalsa、b和a.hashCode==b.hashCode是不可替代的

例如,Objects.equalsa,Ab为false,但AA.hashCode==Ab.hashCode为true。

我使用了ifObjects.equalsa,b而不是ifa.equalsb,因为

在国际化上下文中调用的“String.equals”会报告任何调用 相等、相等信号、比较到或比较信号 在字符串对象上。这样的电话在一个国家通常是不正确的 国际化环境

对于API<19,我使用了ifa.hashCode==b.hashCode,而不是ifObjects.equalsa,b,因为

调用需要API级别19当前最小值为14: java.util.Objectsequals


字符串有自己的equals和equalsIgnoreCase版本。使用它们,

好吧,您永远不应该使用a.hashCode==b.hashCode,因为两个不同字符串的hashCode可以相同。您还需要在api 19之前和之后的string类中检查两个被重写的方法,即equals和hashcode,以了解这一点。其中一个原因可能是您的字符串可能非常大,为了减少使用a.hashcode==b.hashcode所花费的时间,我不知道为什么您认为API v19在这里有特殊的含义。equals和hashcode的定义自90年代中期Java问世以来就已经设置好了。对于字符串来说,什么更好完全取决于您试图如何处理字符串。如果你想看看它们是否代表相同的值,那么这两种味道的相等值是正确的;如果您试图查看它们是否用相同的hashcode表示字符串,hashcode是正确的?在这里,我可以阅读关于APIequals和hashCode方法的差异,自从Java语言的第一个版本以来,这两个方法都是在class对象中定义的。我无法想象为什么API=19会有所不同。在API上使用equals应该没有问题。只有当您想访问新的API功能,而且还想支持旧的Android版本时,才应该使用不同的方法,或者通常使用不同的代码。Android使用Java,自从Java 1和Android API 1以来,equals和hashCode都是可用的,因此两者都必须是可访问的:您谈论的不是Java语言的新特性或Android API的新特性,而是Java的一个基本特性。希望这更清楚。除此之外,hashCode可以为两种完全不同类型的对象返回相同的结果。我可以有一个整数和一个散列为相同值的字符串。如果您想测试相等性,请始终使用相等值。@Raffolox我编辑了问题并在下面发布了我的答案您知道Objects.equalsa,b是如何实现的吗?这并没有什么神奇之处:如果参数不为null(它们不可能为null),那么如果您计划在它们上调用hashCode,则与调用a.equalsb相同。