集合的哈希码方法的最佳实现

2022-08-31 05:02:35

我们如何确定集合方法的最佳实现(假设已正确重写等式方法)?hashCode()


答案 1

最好的实现?这是一个很难回答的问题,因为它取决于使用模式。

对于几乎所有情况,Josh Bloch《第8项中的有效Java》(第二版)中都提出了合理的良好实现。最好的办法是在那里查找它,因为作者在那里解释了为什么这种方法是好的。

简短版本

  1. 创建并分配一个非零值。int result

  2. 对于该方法中测试的每个字段,请通过以下方式计算哈希代码:fequals()c

    • 如果字段 f 是 : 计算boolean(f ? 0 : 1);
    • 如果字段 f 是 、 或 : 计算bytecharshortint(int)f;
    • 如果字段 f 是 : 计算long(int)(f ^ (f >>> 32));
    • 如果字段 f 是 : 计算floatFloat.floatToIntBits(f);
    • 如果字段 f 是 : 计算并处理返回值,就像每个长整头值一样;doubleDouble.doubleToLongBits(f)
    • 如果字段 f 是对象:使用方法的结果,如果hashCode()f == null;
    • 如果字段 f 是一个数组:将每个字段视为单独的元素,并以递归方式计算哈希值,并按如下所述组合这些值。
  3. 将哈希值与 :cresult

    result = 37 * result + c
    
  4. 返回result

对于大多数使用情况,这应该会导致哈希值的正确分布。


答案 2

如果您对 dmeister 推荐的有效 Java 实现感到满意,则可以使用库调用,而不是滚动自己的库调用:

@Override
public int hashCode() {
    return Objects.hashCode(this.firstName, this.lastName);
}

这需要 Guava () 或 Java 7 中的标准库 (),但工作方式相同。com.google.common.base.Objects.hashCodejava.util.Objects.hash


推荐