你可以看到的hashCode函数在执行
java.util.ArrayList的
public int hashCode() { int hashCode = 1; Iterator<E> i = iterator(); while (i.hasNext()) { E obj = i.next(); hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode()); } return hashCode;}这是一个这样的示例,您的Eclipse生成的代码遵循类似的实现方式。但是,如果您觉得自己必须自己实现hashCode,那么Joshua
Bloch在其著名的著作EffectiveJava中提供了一些很好的指南。我将发布该书第9条中的重点。那些是,
- 将一个恒定的非零值(例如17)存储在一个名为result的int变量中。
- 对于对象中的每个有效字段f(即equals方法考虑的每个字段),执行以下操作:
一个。计算该字段的int哈希码c:
一世。如果该字段是布尔值,则计算(f?1:0)。
ii。如果该字段是字节,char,short或int,则计算(int)f。
iii。如果该字段很长,则计算(int)(f ^(f >>> 32))。
iv。如果该字段是浮点型,则计算Float.floatToIntBits(f)。
v。如果该字段是双精度型,则计算Double.doubleToLongBits(f),然后对结果进行哈希运算,如步骤2.a.iii中所述。
vi。如果字段是对象引用,并且此类的equals方法通过递归调用equals来比较字段,则在字段上递归调用hashCode。如果需要更复杂的比较,请为此字段计算一个“规范表示”,并在规范表示上调用hashCode。如果该字段的值为null,则返回0(或其他常数,但0是传统的)
七。如果该字段是数组,则将其视为每个元素都是一个单独的字段。也就是说,通过递归应用这些规则为每个重要元素计算哈希码,并按照步骤2.b组合这些值。如果数组字段中的每个元素都很重要,则可以使用版本1.5中添加的Arrays.hashCode方法之一。
b。将步骤2.a中计算的哈希码c合并为以下结果:
> result = 31 * result + c;
- 返回结果。
4.
当您完成hashCode方法的编写时,请问自己是否相等的实例具有相等的哈希码。编写单元测试以验证您的直觉!如果相等的实例具有不相等的哈希码,请找出原因并解决问题。
我认为Java语言设计人员和Eclipse似乎遵循类似的准则。快乐的编码。干杯。



