java集合的hashCode方法的最佳实现

一、概述

我们如何确定hashCode()用于集合方法的最佳实现(假设equals方法已被正确覆盖)?
 

二、详解

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

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

简短版

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

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

    • 如果字段f为boolean:计算(f ? 0 : 1);
    • 如果该字段f是bytecharshortint:计算(int)f;
    • 如果字段f为long:计算(int)(f ^ (f >>> 32));
    • 如果字段f为float:计算Float.floatToIntBits(f);
    • 如果字段f是double:计算Double.doubleToLongBits(f)和处理返回值,就像每个长值一样;
    • 如果字段f是对象:使用hashCode()方法的结果,如果为0,则为0 f == null否则,为0 
    • 如果字段f是一个数组请将每个字段视为单独的元素,并以递归方式计算哈希值,然后组合值,如下所述。
  3. 将哈希值cresult

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

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

如若转载,请注明出处:https://www.javaidea.cn/article/8327.html

(0)
上一篇 2022年2月7日 上午10:03
下一篇 2022年2月7日 上午10:03

相关推荐

发表评论

您的电子邮箱地址不会被公开。