Java 字符串a,b:if(a.equals(b)),if(Objects.equals(a,b))或if(a..hashCode()==b.hashCode())?
什么对字符串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可以为两种完全不同类型的对象返回相同的值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
从语义和惯例的角度来看,使用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相同。