java - 相等的对象必须具有相等的哈希码?

标签 java collections hashcode

相等对象必须具有相等的哈希码。根据我的理解,当我们打算在基于散列的数据结构中使用对象时,此声明是有效的。这是 java 文档中 hashcode 和 equals 方法的契约(Contract)之一。我探究了为什么这样说并查看了 implementation of hashtable并在 put 方法

中找到以下代码
if ((e.hash == hash) && e.key.equals(key)) 

所以我明白了,合约来自上面的条件 e.hash == hash。我进一步尝试探索为什么 java 在比较两个对象是否相等时检查哈希码。所以这是我的理解

  • 如果两个相等的对象具有相同的 hascode,那么它们可以存储在同一个桶中,这对于仅在单个桶中查找而言会很好

  • 最好检查 hashcode 然后实际调用 equals 方法,因为 hascode 方法比 equals 方法成本更低,因为这里我们只需要比较 int 值,而 equals 方法可能涉及对象字段比较。因此哈希码方法提供了一个额外的过滤器。

如果以上两个理由都成立,请指正?

最佳答案

  1. 正确,只是一个小的更正 - 如果两个不相等对象具有相同的哈希码。
  2. 不完全是,最好先检查它,作为不相等的过滤器,但如果你想确保对象相等,你应该调用 equals()

关于java - 相等的对象必须具有相等的哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6971542/

相关文章:

Java - 对于基类集合中的每个派生类

C# DotNetZip 错误 : The final hash has not been computed. 在 Ionic.Zip.WinZipAesCipherStream.get_FinalAuthentication()

java - Grails:检查分离的对象是否在附加的集合中

java - 转换为可移植文件路径

Java:获取对象的唯一哈希值

java - 当我使用 JSch 运行命令时删除不需要的字符

java - 为什么 ByteBuffers 的 hashCodes 是一样的?

java - 利用庞大的数据库提高 SQLite 性能

scala - 当我使用 Seq[T] 构造函数时,会创建什么具体的数据类型?

java - 无法将返回的 java.util.ArrayList 分配给 scala.collection.mutable.ArrayBuffer。为什么?