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

M S*_*ach 1 java collections hashcode

等于对象必须具有相同的哈希码.根据我的理解,当我们打算在基于哈希的数据集中使用对象时,此语句是有效的.这是java docs中hashcode和equals方法的合同之一.我探究了为什么这样说并查看了哈希表实现,并在put方法中找到了下面的代码

if ((e.hash == hash) && e.key.equals(key)) 
Run Code Online (Sandbox Code Playgroud)

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

  • 如果两个相等的对象具有相同的hascodes,则它们可以存储在同一个存储桶中,这在仅在单个存储桶中查找方面会很好

  • 最好检查hashcode然后实际调用equals方法,因为hascode方法比equals方法成本更低,因为这里我们只需比较int值,其中equals方法可能是对象字段比较.所以hashcode方法提供了一个额外的过滤器.

如果以上两个原因都有效,请纠正我?

MBy*_*ByD 7

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