java - 为什么Java中不同对象的hashCode()可以返回相同的值?

标签 java data-structures hash hashcode

摘 self 正在阅读的书 Head First Java :

The point is that hashcodes can be the same without necessarily guaranteeing that the objects are equal, because the "hashing algorithm" used in the hashCode() method might happen to return the same value for multiple objects.

为什么 hashCode() 方法可能会为不同的对象返回相同的值?这不会引起问题吗?

最佳答案

散列一个对象意味着“找到一个好的、描述性的值(数字),可以由同一个实例一次又一次地复制”。因为来自 Java 的 Object.hashCode() 的哈希码属于 int 类型,所以您只能有 2^32 个不同的值。这就是为什么当两个不同的对象产生相同的 hashCode 时,根据哈希算法,您会遇到所谓的“冲突”。

通常,这不会产生任何问题,因为 hashCode() 主要与 equals() 一起使用。例如,HashMap 将对其键调用hashCode(),以了解键是否可能已包含在 HashMap 中。如果 HashMap 没有找到哈希码,很明显 HashMap 中还没有包含该键。但如果是这样,它将必须使用 equals() 仔细检查所有具有相同哈希码的 key 。

A.hashCode() == B.hashCode() // does not necessarily mean
A.equals(B)

但是

A.equals(B) // means
A.hashCode() == B.hashCode()

如果 equals()hashCode() 实现正确。

有关一般 hashCode 契约的更精确描述,请参阅 Javadoc .

关于java - 为什么Java中不同对象的hashCode()可以返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4360035/

相关文章:

java - Spring Security 国际化消息不会被覆盖

Java PrintWriter 文件未找到

c++ - MD5 散列时填充字符串

ruby - 如何找到最大值hash的key?

java - 如何检查Java中用户输入的类型?

java - 在 Java 中创建 JSON 对象的方法

Java 泛型无法识别类型?

database - 有没有在数据库中存储矢量信息的标准方法?

c - 如何为常量大小的数组类型的变量定义名称?

php - 加盐密码安全