为什么Java中的Object类有两个方法hashcode()和equals()?它们中的一个看起来是多余的,而且这些方法被传递到了最底层的派生类中?
你认为为什么 hashCode 是多余的?它们表达的意思是不同的:
hashCode
的作用是“提供一种有效的方式来判断两个对象是否可能相等”equals
的作用是“检查这个对象是否与另一个对象真正相等”你绝对需要这两个方法 - 虽然我不认为它们应该一开始就在 Object 中。
你绝对需要哈希码来在哈希表中进行高效查询 - 但你还必须进一步检查相等性,因为哈希码会发生冲突(例如,可能出现更多的字符串比哈希码)。
首先,当你重写equals()方法时,必须同时重写hashcode()方法。
如果不这样做,将会违反Object.hashCode的通用约定,这将导致你的类与所有基于哈希的集合(包括HashMap、HashSet和Hashtable)不能很好地配合使用。
以下是从Object规范[JavaSE6]中复制的约定:
hashcode()
)来快速检查两个对象是否可能相等。如果它们的哈希码相等,则这些对象可能相等(不一定,但这是一个很好的猜测)。然后执行更深入(也更昂贵)的equals()
检查。 这对于加速各种查找(从映射等)非常重要。在编程中,equals用于比较对象,hashcode用于从对象生成哈希值,然后由Java映射容器(Hashtable、Map等)使用。
通常的做法是同时覆盖它们(如果你重写了hashcode,你需要同时重写equals反之亦然)。
Integer.MAX_VALUE
,而理论上您可以创建无限数量的不同对象。 - BalusC