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

时间:2012-07-24 15:04:41

标签: java equals hashcode

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

5 个答案:

答案 0 :(得分:9)

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

  • 在参数
  • 中获取密钥的hashCode()
  • 从此哈希码中推断出该桶
  • 将存储桶中的每个密钥与参数中的密钥进行比较(使用equals())以找到正确的密钥

如果两个相等的对象没有相同的哈希码,则算法的前两个步骤将不起作用。而且这两个使HashMap非常快的第一步(O(1))。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

据我所知,这些语言没有被烘焙 - 你可以在技术上拥有equals()方法不会检查哈希码的对象,但你会得到非常奇特的结果。

特别是如果你将一堆这些对象放入HashMap或HashSet中,map / set将使用hashCode()方法来确定对象是否可能是重复的 - 所以你可以有一个集合将存储的情况2您已定义为equals(永远不会发生)的对象,因为它们各自返回不同的hashCodes。

答案 4 :(得分:0)

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

第一步:计算hashcode()

第二步:计算equals()

这是因为如果你把你的对象作为密钥放在像hashmap这样的集合中,你的密钥将首先在hashcode()方法上进行比较,如果它找到匹配的哈希码,那么它会继续计算equals()。

就像索引更好的搜索效果一样