为什么hashCode()和equals()都存在

时间:2010-03-18 11:09:24

标签: java

为什么java Object类有两个方法hashcode()和equals()?其中一个看起来多余,它渗透到最底层的派生阶段?

4 个答案:

答案 0 :(得分:12)

为什么你认为一个是多余的?他们说不同的事情:

  • hashCode是“给我一些有效的方法来判断两个对象可能是否相等”
  • equals是“检查此对象是否真的等于另一个”

你绝对需要两者 - although I don't believe they should really be in Object in the first place

您绝对需要哈希码才能使用哈希表执行高效查找 - 并且您绝对需要进一步的相等性检查,因为哈希发生冲突(例如,存在比哈希码更多的可能字符串)

答案 1 :(得分:2)

首先,当你重写equals()时,你必须覆盖hashcode()。

未能这样做 将导致违反Object.hashCode的一般合同,这将是 防止您的类与所有基于哈希的类一起正常运行 集合,包括HashMap,HashSet和Hashtable。

这是从对象规范[JavaSE6]:

复制的合同
  • 每当在执行期间多次在同一对象上调用它时 对于一个应用程序,hashCode方法必须始终返回 相同的整数,没有提供等于比较的信息 对象被修改。这个整数不需要保持一致 应用程序的另一个执行相同的应用程序。
  • 如果两个对象根据equals(Object)方法相等,则调用 - 对两个对象中的每个对象的hashCode方法必须产生相同的 整数结果。
  • 如果两个对象根据equals(Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法 必须产生不同的整数结果。但是,程序员应该是 意识到为不相等的对象产生不同的整数结果可能会改善 哈希表的性能。

答案 2 :(得分:2)

基本思想是通过比较hashcode(),快速检查两个对象是否可能相等。如果他们的哈希码相等,那么对象可能是相等的(不一定,但这是一个很好的猜测)。然后执行使用equals()的更深刻(且更昂贵)的检查。这对于加速所有类型的查找非常重要(来自地图等)。

答案 3 :(得分:1)

equals是比较对象,hashcode用于从对象生成哈希值,然后由java地图容器(Hashtable,Map等)使用。

通常的做法是一起覆盖它们(如果覆盖哈希码,则需要覆盖等号,反之亦然)。