2 回答

TA贡献1890条经验 获得超9个赞
两个对象的hashCode互相相等,但是==和equals()会得到false是什么情况?
根据Java文档:
如果对象相等(即
x.equals(y) == true
),那么hashCode
这些对象也应该相等(即x.hashCode() == y.hashCode()
)如果两个对象相等
hashCode
(iex.hashCode() == y.hashCode()
),那么这些对象不必须相等(iex.equals(y) == true/false
)

TA贡献1828条经验 获得超3个赞
当两个对象的 hashCode 彼此相等,但是 == 和 equals() 会得到 false 是什么情况?
当发生哈希码冲突时。
例子
考虑这两个多头:
Long l1 = 1L;
Long l2 = 4294967296L; //which is 2 ^ 32
您是否同意存在不同并且equals()会返回false?然而,结果
l1.hashCode() == l2.hashCode()
是真的。
为什么?查看 hashCode 的实现Long:
public static int hashCode(long value) {
return (int)(value ^ (value >>> 32));
}
由于 long 可以有 2^64 个值,而 hashcode 的返回值是一个可以有 2^32 个值的 int,所以发生冲突是正常的(每个值都会与 2^32 个其他值发生冲突)。
澄清
但是我曾经听说 override equals() 也必须覆盖 hashCode() ,所以这个问题不会发生。
是的,当您覆盖时,您equals()也应该覆盖hashCode()。这是真的,但我认为你混淆了含义。从hashcode 的 javadoc:
如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。
如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
所以含义
a.equals(b) => a.hashCode() == b.hashCode()
必须始终为真(如果您的方法正确实施)但相反的含义
a.hashCode() == b.hashCode() => a.equals(b)
不一定要。
添加回答
举报