哈希码冲突会影响 Java 中的等于吗?



hashCode()协定允许不同的对象具有相同的哈希代码。从文档中:

如果根据equals(java.lang.Object( 方法,两个对象不相等,则对两个对象中的每一个调用 hashCode 方法必须产生不同的整数结果,

则不需要。

同时,在 Eclipse 中,如果使用函数 Source->Generate hashCode(( 和 equals,你会得到这样的东西:

package test1;
public class j1 {
private int a;
private int b;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + a;
result = prime * result + b;
return result;
}
@Override
public boolean equals(Object obj) {
//compare hashcode
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
j1 other = (j1) obj;
if (a != other.a)
return false;
if (b != other.b)
return false;
return true;
}
}

在函数 equals(( 中,我们首先比较thisobj的哈希码,如果它们具有相同的哈希码,则 equals(( 返回 true。但该文件说,两个不同的对象可能有不同的哈希码,这将影响equals()的正确性。我只是想不通这个问题。

在函数 equals(( 中,我们首先比较 this 和 obj 的哈希码,如果它们具有相同的哈希码,则 equals(( 返回 true。

不,if (this == obj)不会比较两个对象的哈希代码。它检查thisobj是否引用相同的Object,在这种情况下,它们也必须相等(因为任何Object都应该等于自身(,因此在这种情况下不需要执行以下所有equals逻辑。

另一方面,如果this != objthisobj指的是不同的Objects,但仍然可能彼此相等,这取决于equals的逻辑。如果equals的逻辑返回true,合约要求它们必须具有相同的hashCode()

this == obs的调用不比较哈希代码。它比较对象的引用。基本上检查你是否像这样使用它

this.equals(this)这是真的。

最新更新