在 java 对象中覆盖哈希码的目的是啥? [复制]

Posted

技术标签:

【中文标题】在 java 对象中覆盖哈希码的目的是啥? [复制]【英文标题】:what is the purpose of overriding hashcode in java object? [duplicate]在 java 对象中覆盖哈希码的目的是什么? [复制] 【发布时间】:2013-08-02 16:07:24 【问题描述】:

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

在什么情况下最好覆盖java中的hashcode?​​p>

【问题讨论】:

@RohitJain:我看到了,但它并没有真正谈论目的 @JonSkeet。是的,没错,这并不是真正的目的。但是在某个答案的深处,在一个小声明中提到了它。它仍然对 OP 有用。 :) 【参考方案1】:

在什么情况下最好覆盖java中的hashcode?​​p>

当您覆盖equals 时,基本上。这意味着基于散列的集合(例如 HashMapHashSet)可以非常快速地找到一组 candidate 对象,这些对象将等于您正在寻找(或尝试)的对象添加或其他)。如果您有一个大型集合,您可以通过哈希码将其拆分为存储桶。当您尝试查找某些内容时,您会找到已传递对象的哈希码,并在相关存储桶中查找具有相同哈希码的对象。然后对于每个具有 exact 相同哈希码的对象,您调用equals 来查看这两个对象是否真的 相同。

请参阅Wikipedia article on hash tables 了解更多信息。

编辑:关于选择哈希码的简要说明...

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

另一方面,如果您没有正确实现 hashCode 并为调用相等的对象(或两次调用同一对象两次)返回 不同 值,您就赢了' 搜索时无法找到该对象 - 不同的哈希码将排除相等性,因此 equals 甚至永远不会被调用。

然后是可变性方面 - equalshashCode 使用对象的可变方面通常是一个坏主意:如果在将对象插入到基于散列的集合,您将无法再次找到它,因为插入时的散列将不再正确。

【讨论】:

我建议指出每个方向不一致的不同后果。拥有两个相等但具有不同哈希码的对象可能会导致来自哈希数据结构的错误答案。让所有元素使用相同的哈希码永远不会导致错误答案,但会导致性能不佳。 @PatriciaShanahan:好点。当我有时间时会添加一个编辑。 (可能暂时不会。) @jonSkeet 对不起......我不清楚......你能帮我解释一下吗? @Saravanan: 不是没有更多的想法,特别是你不了解什么。您是否阅读了链接的***文章?你以前用过哈希表吗? @JonSkeet 是的,我已经习惯了...我再看一次***...

以上是关于在 java 对象中覆盖哈希码的目的是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

可选与空。 Java 8 中 Optional 的目的是啥? [复制]

JAVA:当我可以使用我想使用的对象的全名时,变量“this”的目的是啥? [复制]

java中的toString()是啥方法?

在 Angular 6 中使用 rxjs 可观察对象的目的是啥?与 async/await 相比,rxjs 的优势是啥? [复制]

CIL nop 操作码的目的是啥?

在 Java 中复制对象