我知道多个对象在java对象中具有相同的哈希码。它根本没有任何问题。那么,在java中覆盖哈希码的目的是什么......
在什么情况下最好覆盖java中的哈希码?
在什么情况下最好覆盖java中的哈希码?
当你覆盖equals
时,基本上。这意味着基于散列的集合(例如HashMap
, HashSet
)可以非常快速地找到一组候选对象,这些对象将等于您正在寻找的对象(或尝试添加,或其他)。如果您有一个大型集合,您可以通过哈希码将其拆分为存储桶。当您尝试查找某些内容时,您会找到已传递对象的哈希码,并在相关存储桶中查找具有相同哈希码的对象。然后对于具有完全相同哈希码的每个对象,您调用equals
以查看这两个对象是否真的相同。
有关更多信息,请参阅有关哈希表的 Wikipedia 文章。
编辑:关于选择哈希码的快速说明......
无论对象的内容如何,只需覆盖并返回一些常量(每次调用都相同)总是有效的。hashCode
但是,此时您将失去哈希码的所有好处-基本上,基于哈希的容器会认为您的类型的任何实例都可能等于任何其他实例,因此搜索一个将由对equals
.
在规模的另一端,如果您没有hashCode
正确实现并为对相等对象的调用(或对同一对象的两次调用)返回不同的值,您将无法在搜索时找到该对象- 不同的哈希码将排除相等性,因此equals
甚至永远不会被调用。
然后是可变性的方面——对于equals
和hashCode
使用对象的可变方面通常是一个坏主意:如果在将对象插入基于哈希的集合后以哈希更改的方式对其进行变异,则不会能够再次找到它,因为插入时的哈希将不再正确。