java - Boolean.hashCode()

标签 java boolean hashcode

Boolean类的hashCode()方法是这样实现的:

public int hashCode() {
    return value ? 1231 : 1237;
}

为什么使用 1231 和 1237?为什么不是别的?

最佳答案

1231 和 1237 只是两个(足够大)任意素数。任何其他两个大素数都可以。

为什么是素数?
假设我们选择了合数(非素数),比如 1000 和 2000。当将 boolean 值插入哈希表时,truefalse 将进入桶 1000 % N resp 2000 % N(其中N是桶的数量)。

现在请注意

  • 1000 % 82000 % 8
  • 相同的桶
  • 1000 % 102000 % 10
  • 相同的桶
  • 1000 % 202000 % 20
  • 相同的桶
  • ....

换句话说,它会导致许多冲突

这是因为 1000 的因式分解 (23, 53) 和 2000 的因式分解 (24, 53) 有很多共同因素。因此选择素数,因为它们不太可能与桶大小有任何共同因素。

为什么素数。 2和3不行吗?
在计算复合对象的哈希码时,通常会为组件添加哈希码。如果在具有大量存储桶的哈希集中使用的值太小,则可能会导致对象分布不均。

碰撞重要吗? boolean 值只是有两个不同的值吗?
map 可以包含 boolean 值和其他对象。此外,正如 Drunix 所指出的,创建复合对象散列函数的常用方法是重用子组件散列代码实现,在这种情况下,最好返回大素数。

相关问题:

关于java - Boolean.hashCode(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3912303/

相关文章:

Java 泛型 - 不兼容的等式约束

java - 如何使用findViewById获取ListView

where 子句上的 mysql boolean 值

c# - 为什么 VS 一直坚持要求另一个正确的 parent ?

algorithm - 字符串和整数范围集合的散列方法

objective-c - 对于具有两个字符串和两个 BOOL 的对象,什么是好的散列?

java - 为什么Java允许类名与它导入的类名相同?

java - Gradle - 使用 Java 7 的 Spring Boot

java - 如何使用 Ruby 生成 Java 的 String hashCode

database - 使用 boolean 逻辑创建数据库 View