我知道java对象中有多个具有相同哈希码的对象。它根本没有任何问题。所以,在java中覆盖哈希码的目的是什么...
在哪种情况下建议覆盖java中的哈希码?
答案 0 :(得分:8)
在哪种情况下建议覆盖java中的哈希码?
基本上覆盖equals
时。这意味着基于散列的集合(例如HashMap
,HashSet
)可以非常快速地找到一组候选对象,这些对象将等于您正在查找的对象for(或试图添加,或其他)。如果您有一个大型集合,则可以通过哈希代码将其拆分为存储桶。当您尝试查找某些内容时,您会找到已传递的对象的哈希码,并在相关存储桶中查找具有相同哈希码的对象。然后对于具有完全相同哈希码的每个对象,您调用equals
以查看这两个对象是否真的相同。
有关详细信息,请参阅Wikipedia article on hash tables。
编辑:关于哈希码选择的快速说明......
总是有效只是覆盖hashCode
并返回一些常量(每次调用都相同),无论对象的内容如何。但是,此时您将失去哈希代码的所有好处 - 基本上基于哈希的容器会认为您的类型的任何实例可能与任何其他实例相同,因此搜索一个将包含O(N)呼叫equals
。
在比例的另一端,如果你没有正确实现hashCode
并为同等对象的调用返回不同的值(或者对同一对象的两次调用两次)您在搜索时将无法找到该对象 - 不同的哈希代码将排除相等性,因此永远不会调用equals
。
然后就是可变性方面 - equals
和hashCode
使用对象的可变方面通常是一个坏主意:如果你在改变后改变对象的方式将其插入基于散列的集合中,您将无法再次找到它,因为插入时的散列将不再正确。