在java对象中重写hashcode的目的是什么?

Sar*_*nan 4 java hashtable hashcode

我知道java对象中有多个具有相同哈希码的对象.它根本没有任何问题.所以,在java中覆盖哈希码的目的是什么...

在哪种情况下,建议在java中覆盖哈希码?

Jon*_*eet 8

在哪种情况下,建议在java中覆盖哈希码?

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

有关更多信息,请参阅有关哈希表Wikipedia文章.

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

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

在比例的另一端,如果你没有hashCode正确实现并返回一个不同的值来调用相等的对象(或两次调用同一个对象两次),你将无法在搜索它时找到该对象- 不同的哈希码将排除相等性,因此equals甚至不会被调用.

然后是可变性的方面 - 对于equalshashCode使用对象的可变方面来说通常是一个坏主意:如果在将对象插入基于散列的集合中之后以改变散列的方式改变对象,则不会能够再次找到它,因为插入时的哈希将不再正确.