0

如果你能清除我的疑问,我将非常感激假设我有一个 A 类和 B A 有 B 的参考,比如 b1 和 b2。就像在类 A 中一样,重写了类似 b1.equal(other.b1) 和 b2.equal(other.b2) 的方法

并覆盖哈希码方法,例如

int result = 1;
result = 17* result + ((b1== null) ? 0 : b1.hashCode());
result = 17* result + ((b2== null) ? 0 : b2.hashCode());
return result;

我的哈希码方法是否正确实施?如果我调用 b1.hashcode() 那么它也会调用 B 类的 hashcode 方法吗?如果是,那么是否必须覆盖 B 类中的等号和哈希码?

提前致谢。

4

3 回答 3

2

Java中唯一的要求hashCode()是一致性。这意味着两个相同的实例A 必须返回相同的哈希码。如果您的代码这样做,那么您在技术上是好的。这意味着从技术上讲,一个hashCode()简单的函数return 1是有效的。显然,这是一个糟糕的实现,因为它有 100% 的冲突率。所以为了做出好的hashCode功能,你也应该尽量减少你的碰撞率。

话虽如此,您的代码看起来不错。

于 2013-09-24T15:24:29.303 回答
1

这看起来是正确的。是的,您也应该覆盖 B 类的 hashCode 和 equals 方法。

于 2013-09-24T15:22:17.510 回答
1

看起来不错,尽管它可以简化为:

 int result = ((b1== null) ? 0 : b1.hashCode());
 result = 17* result + ((b2== null) ? 0 : b2.hashCode());
 return result;
于 2013-09-24T15:24:50.330 回答