集合的哈希码方法的最佳实现
我们如何确定集合方法的最佳实现(假设已正确重写等式方法)?hashCode()
最好的实现?这是一个很难回答的问题,因为它取决于使用模式。
对于几乎所有情况,Josh Bloch的《第8项中的有效Java》(第二版)中都提出了合理的良好实现。最好的办法是在那里查找它,因为作者在那里解释了为什么这种方法是好的。
创建并分配一个非零值。int result
对于该方法中测试的每个字段,请通过以下方式计算哈希代码:f
equals()
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
;将哈希值与 :c
result
result = 37 * result + c
返回result
对于大多数使用情况,这应该会导致哈希值的正确分布。
如果您对 dmeister 推荐的有效 Java 实现感到满意,则可以使用库调用,而不是滚动自己的库调用:
@Override
public int hashCode() {
return Objects.hashCode(this.firstName, this.lastName);
}
这需要 Guava () 或 Java 7 中的标准库 (),但工作方式相同。com.google.common.base.Objects.hashCode
java.util.Objects.hash