Boolean.hashCode()
类Boolean的hashCode()方法是这样实现的:
public int hashCode() { return value ? 1231 : 1237; } 为什么使用1231和1237? 为什么不是别的?
1231和1237只是两个(足够大)的任意素数 。 任何其他两个大素数都可以。
  为什么是素数? 
 假设我们select了复合数字(non-primes),比如说1000和2000.当插入布尔值到哈希表中时, true和false会进入桶1000 % N resp 2000 % N (其中N是桶的数量)。 
现在注意到
-   1000 % 8同斗2000 % 8
-   1000 % 10与2000 % 10相同的斗2000 % 10
-   1000 % 202000 % 20
- ….
换句话说,会导致很多的碰撞 。
这是因为1000(2,3,5 3 )的因式分解和2000(2 4,5 3 )的因式分解有许多共同的因素。 因此素数被选中,因为它们不可能与桶大小有任何共同的因素。
  为什么大素数。  不会2和3吗? 
 在计算组合对象的哈希代码时,通常为组件添加哈希代码。 如果在具有大量桶的哈希集合中使用太小的值,则存在以不均匀的对象分布结束的风险。 
  碰撞是否重要?  布尔有两个不同的值呢? 
 地图可以包含与其他对象一起的布尔值。 另外,正如Drunix所指出的,创build组合对象的散列函数的常用方法是重用子组件哈希代码实现,在这种情况下,返回大的质数是很好的。 
相关问题:
- 为什么在hashCode中使用素数?
- 哈希码计算的明智之处是什么?
- 为什么String中的hashCode()使用31作为乘数?