集合的hashCode方法的最佳实现

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

最好的实现方式是什么?这是一个困难的问题,因为它取决于使用模式

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

简本

  1. 创建一个int结果,并分配一个非零值

  2. 对于在equals()方法中测试的每个字段f,计算哈希代码c

    • 如果字段f是布尔值:
      计算(f?0:1)

    • 如果字段f是字节字符整数:计算(整数)f
    • 如果字段f是一个长的:计算(int)(f^(f>>>32))
    • 如果字段f是一个float:计算float.floatToIntBits(f)
    • 如果字段f是一个double:计算double.doubleToLongBits(f),并像处理每个长值一样处理返回值
    • 如果字段f是对象:使用hashCode()方法的结果,如果f==null,则使用0
    • 如果字段f是一个数组:将每个字段视为单独的元素,以递归方式计算哈希值,并按照下面的说明组合这些值
  3. 将哈希值c结果相结合:

    结果=37*结果+c
    
  4. 返回结果

这将导致大多数使用情况下哈希值的正确分布

发表评论