具有相同哈希码的两个 Java 对象是否不一定相等?

新手上路,请多包涵

我理解为什么为两个相等的(通过 equals )对象提供相同的哈希码很重要。但反之亦然,如果两个对象具有相同的哈希码,它们是否必须相等?合同还有效吗?我找不到可能发生这种情况的示例,因为如果所有参与 equals 方法的属性也被用于覆盖 hashcode 方法,那么我们将始终使用相同的对象的相同 hashcode 。请评论。

原文由 Abidi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 461
2 个回答

如果两个对象具有相同的 hashcode 那么它们不一定相等。否则你会发现完美的散列函数。

但恰恰相反:如果对象相等,则它们必须具有相同的 hashcode

原文由 Petar Minchev 发布,翻译遵循 CC BY-SA 4.0 许可协议

hashCode 函数的目的是允许对象快速划分为已知不等于其自身集合之外的所有项目的事物集合。假设一个人有 1,000 个项目,并且将它们分成十个大小大致相等的集合。一次调用 hashCode 可以快速识别该项目不等于 900 项,而无需对这些项目中的任何一项使用 equals 。即使必须使用 equals 将该项目与其他 100 项进行比较,这仍然只是将其与所有 1000 项进行比较的成本的 1/10。实际上,即使在大型集合中, hashCode 通常会消除 99.9% 或更多的不相等项目,最多只留下少数要检查的项目。

原文由 supercat 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题