3

为什么 java 设计者强制要求如果 obj1.equals(obj2) 那么 obj1.hashCode() 必须是 == obj2.hashCode()

4

5 回答 5

9

因为 HashMap 使用以下算法快速找到键:

  • 获取hashCode()参数中的关键
  • 从此哈希码推导出桶
  • 将桶中的每个键与参数中的键(使用equals())进行比较以找到正确的键

如果两个相等的对象没有相同的哈希码,那么算法的前两个步骤将不起作用。正是前两个步骤使 HashMap 变得非常快(O(1))。

于 2012-07-24T15:09:08.367 回答
4

没有授权。这是一个很好的做法,因为如果您的对象打算用于基于哈希的数据结构(如 HashMap/HashSet 等),这是一个必需条件。

于 2012-07-24T15:06:39.793 回答
1

因为哈希码用于快速确定两个对象是否不相等。

于 2012-07-24T15:06:55.287 回答
1

据我所知,这并没有融入语言 - 从技术上讲,您可以拥有其 equals() 方法不检查哈希码的对象,但您会得到非常奇特的结果。

特别是,如果您将一堆这些对象放入 HashMap 或 HashSet 中,则映射/集合将使用 hashCode() 方法来确定对象是否可能是重复的 - 因此您可能会遇到一个集合将存储 2 个对象的情况已经定义为等于(这永远不会发生),因为它们每个都返回不同的哈希码。

于 2012-07-24T15:09:59.183 回答
0

它有两个步骤匹配以提高性能。

第一步:计算hashcode()

第二步:计算equals()

这是因为如果你把你的对象作为像 hashmap 这样的集合中的键,你的键将首先在 hashcode() 方法上进行比较,如果它找到匹配的 hashcode,然后继续计算 equals()。

它类似于索引以获得更好的搜索性能

于 2012-07-24T15:07:22.363 回答