最好的实现方式是什么?这是一个很难回答的问题,因为这取决于使用模式.
在第8项(第二版)的Josh Bloch's Effective Java中,几乎所有情况下都提出了合理的良好实施方案.最好的办法是在那里查阅,因为作者在那里解释了为什么这种方法是好的.
创建一个int result
并指定一个non-zero值.
对于在equals()
方法中测试的every field f
,通过以下方式计算散列码c
:
boolean
:
计算(f ? 0 : 1)
;byte
、char
、short
或int
:计算(int)f
;long
:计算(int)(f ^ (f >>> 32))
;float
:计算Float.floatToIntBits(f)
;double
:计算Double.doubleToLongBits(f)
并像处理每个长值一样处理返回值;hashCode()
方法的结果,如果是f == null
,则使用0;将哈希值c
与result
组合:
result = 37 * result + c
返回result
对于大多数使用情况,这将导致哈希值的正确分布.