在java对象中重写哈希代码的目的是什么?

在java对象中重写哈希代码的目的是什么?,java,hashtable,hashcode,Java,Hashtable,Hashcode,我知道多个对象在java对象中具有相同的哈希代码。这根本不会产生任何问题。那么,在java中重写哈希代码的目的是什么 在哪种情况下,最好在java中重写哈希代码 在哪种情况下,最好在java中重写哈希代码 当您覆盖时,基本上等于。这意味着基于散列的集合(例如,HashMap,HashSet)可以非常快速地找到一组候选对象,这些对象将与您要查找的对象(或尝试添加的对象)相等。如果您有一个大型集合,则可以通过哈希代码将其拆分为多个存储桶。当您试图查找某个对象时,您会找到已传递对象的哈希代码,并在相关

我知道多个对象在java对象中具有相同的哈希代码。这根本不会产生任何问题。那么,在java中重写哈希代码的目的是什么

在哪种情况下,最好在java中重写哈希代码

在哪种情况下,最好在java中重写哈希代码

当您覆盖
时,基本上等于
。这意味着基于散列的集合(例如,
HashMap
HashSet
)可以非常快速地找到一组候选对象,这些对象将与您要查找的对象(或尝试添加的对象)相等。如果您有一个大型集合,则可以通过哈希代码将其拆分为多个存储桶。当您试图查找某个对象时,您会找到已传递对象的哈希代码,并在相关bucket中查找具有相同哈希代码的对象。然后,对于具有完全相同哈希代码的每个对象,调用
equals
,查看这两个对象是否真的相同

有关更多信息,请参阅

编辑:关于哈希代码选择的快速说明

不管对象的内容如何,只要覆盖
hashCode
并返回一些常量(每次调用都是相同的)总是有效的。但是,此时您将失去哈希代码的所有好处—基本上,基于哈希的容器会认为您的类型的任何实例都可能等于任何其他实例,因此搜索一个实例将包括对
equals
的O(N)调用

在天平的另一端,如果您没有正确实现
hashCode
,并为相等对象的调用返回不同的值(或两次调用同一对象),则在搜索对象时将无法找到该对象-不同的哈希代码将排除相等,因此永远不会调用
equals


然后是可变性方面-一般来说,
equals
hashCode
使用对象的可变性方面是个坏主意:如果在将对象插入基于散列的集合后以散列更改的方式对其进行变异,您将无法再次找到它,因为插入时的哈希值将不再正确。

@RohitJain:我看到了,但它并没有真正说明目的。@JonSkeet。是的,对,这不是真正的目的。但在一些深层次的回答中,有一个小声明提到了这一点。尽管如此,这对作品还是有帮助的。我建议指出每个方向不一致的不同后果。拥有两个相等但具有不同哈希代码的对象可能会导致哈希数据结构的错误答案。让所有元素使用相同的哈希代码不会导致错误的答案,但会导致性能不佳。@PatriciaShanahan:这一点很好。当我有时间的时候会添加一个编辑。(可能暂时不会。)@jonSkeet我很抱歉。。。我不清楚。。。“你能再给我解释一点吗?”萨拉瓦南:不知道你到底不明白什么。你读过维基百科的链接文章吗?你以前用过哈希表吗?@JonSkeet是的,我用过。。。我再看一次维基百科。。。