【发布时间】:2010-03-18 11:09:23
【问题描述】:
为什么java Object类有hashcode()和equals()两个方法?其中一个看起来是多余的,并且它渗透到了最底层的派生类?
【问题讨论】:
-
您至少可以尝试阅读 API —— Object.hashcode() 的 Javadoc 明确表示“支持此方法是为了使用由 java.util.Hashtable 提供的哈希表。”
标签: java
为什么java Object类有hashcode()和equals()两个方法?其中一个看起来是多余的,并且它渗透到了最底层的派生类?
【问题讨论】:
标签: java
为什么你认为一个是多余的?他们说不同的话:
hashCode 是“给我一些方法来有效地查看两个对象是否可能相等”equals 是“检查这个对象是否真的等于另一个”你肯定需要两者 - although I don't believe they should really be in Object in the first place。
您绝对需要哈希码才能使用哈希表执行有效的查找 - 而且您绝对需要进一步的相等性检查,因为哈希会发生冲突(例如,可能的字符串远多于哈希码) .
【讨论】:
首先,当您覆盖 equals() 时,您也必须覆盖 hashcode()。
没有这样做 将导致违反 Object.hashCode 的一般合同,这将 阻止您的课程与所有基于哈希的课程一起正常运行 集合,包括 HashMap、HashSet 和 Hashtable。
这是合同,从对象规范 [JavaSE6] 复制而来:
【讨论】:
基本思想是通过比较hashcode()s 可以快速检查两个对象是否可能相等。如果它们的哈希码相等,则对象可能相等(不一定,但这是一个很好的猜测)。然后使用equals() 进行更深入(也更昂贵)的检查。这对于加快所有类型的查找(从地图等)很重要。
【讨论】:
equals 用于比较对象,hashcode 用于从对象生成哈希值,然后由 java map 容器(Hashtable、Map 等)使用。
通常的做法是一起覆盖它们(如果你覆盖哈希码,你需要覆盖equals,反之亦然)。
【讨论】:
Integer.MAX_VALUE,而理论上您可以创建无限数量的不同对象。