Boolean类的hashCode()
方法是这样实现的:
public int hashCode() {
return value ? 1231 : 1237;
}
为什么使用 1231 和 1237?为什么不是别的?
最佳答案
1231 和 1237 只是两个(足够大)任意素数。任何其他两个大素数都可以。
为什么是素数?
假设我们选择了合数(非素数),比如 1000 和 2000。当将 boolean 值插入哈希表时,true 和 false 将进入桶 1000 % N
resp 2000 % N
(其中N
是桶的数量)。
现在请注意
1000 % 8
与2000 % 8
相同的桶
1000 % 10
与2000 % 10
相同的桶
1000 % 20
与2000 % 20
相同的桶
- ....
换句话说,它会导致许多冲突。
这是因为 1000 的因式分解 (23, 53) 和 2000 的因式分解 (24, 53) 有很多共同因素。因此选择素数,因为它们不太可能与桶大小有任何共同因素。
为什么大素数。 2和3不行吗?
在计算复合对象的哈希码时,通常会为组件添加哈希码。如果在具有大量存储桶的哈希集中使用的值太小,则可能会导致对象分布不均。
碰撞重要吗? boolean 值只是有两个不同的值吗?
map 可以包含 boolean 值和其他对象。此外,正如 Drunix 所指出的,创建复合对象散列函数的常用方法是重用子组件散列代码实现,在这种情况下,最好返回大素数。
相关问题:
关于java - Boolean.hashCode(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3912303/