一、概述
我们如何确定hashCode()
用于集合的方法的最佳实现(假设equals方法已被正确覆盖)?
二、详解
最好的实现?这是一个很难的问题,因为它取决于使用模式。
在几乎所有情况下,Josh Bloch的 有效Java项目8(第二版)中都提出了合理的良好实现。最好的办法是在那里查找,因为作者在那里解释了为什么这种方法很好。
简短版
-
创建一个
int result
并分配一个非零值。 -
对于在方法中测试的每个字段
f
,通过以下equals()
方式计算哈希码c
:- 如果字段f为
boolean
:计算(f ? 0 : 1)
; - 如果该字段f是
byte
,char
,short
或int
:计算(int)f
; - 如果字段f为
long
:计算(int)(f ^ (f >>> 32))
; - 如果字段f为
float
:计算Float.floatToIntBits(f)
; - 如果字段f是
double
:计算Double.doubleToLongBits(f)
和处理返回值,就像每个长值一样; - 如果字段f是对象:使用
hashCode()
方法的结果,如果为0,则为0f == null
;否则,为0 。 - 如果字段f是一个数组:请将每个字段视为单独的元素,并以递归方式计算哈希值,然后组合值,如下所述。
- 如果字段f为
-
将哈希值
c
与result
:result = 37 * result + c
-
返回
result
对于大多数使用情况,这应该导致哈希值的正确分配。
如若转载,请注明出处:https://www.javaidea.cn/article/8327.html