为什么java Object类有两个方法hashcode()和equals()?其中一个看起来多余,它渗透到最底层的派生阶段?
答案 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]:
复制的合同答案 2 :(得分:2)
基本思想是通过比较hashcode()
,快速检查两个对象是否可能相等。如果他们的哈希码相等,那么对象可能是相等的(不一定,但这是一个很好的猜测)。然后执行使用equals()
的更深刻(且更昂贵)的检查。这对于加速所有类型的查找非常重要(来自地图等)。
答案 3 :(得分:1)
equals是比较对象,hashcode用于从对象生成哈希值,然后由java地图容器(Hashtable,Map等)使用。
通常的做法是一起覆盖它们(如果覆盖哈希码,则需要覆盖等号,反之亦然)。