我们如何决定集合的hashCode()方法的最佳实现(假设已正确重写equals方法)
最好的实现方式是什么?这是一个困难的问题,因为它取决于使用模式
几乎所有情况下,Josh Bloch在第8项(第二版)中的有效Java中都提出了合理的良好实施方案。最好的办法是在那里查阅,因为作者在那里解释了为什么这种方法是好的
简本
-
创建一个
int结果,并分配一个非零值 -
对于在
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是一个数组:将每个字段视为单独的元素,以递归方式计算哈希值,并按照下面的说明组合这些值
- 如果字段f是布尔值:
-
将哈希值
c与结果相结合:结果=37*结果+c -
返回
结果
这将导致大多数使用情况下哈希值的正确分布