gpt4 book ai didi

java - 相等的对象 = 相等的哈希码结果,java

转载 作者:行者123 更新时间:2023-12-03 01:44:48 25 4
gpt4 key购买 nike

如果我有一个对象(即 bean),它具有可靠、有意义的 equals() 方法,但缺乏补充,那么“最坏情况”的后果是什么(这里是现实世界的场景) hashCode() 方法?似乎大多数 API 都使用 equals()compareTo() 方法来维护集合。我想知道 hashCode() 什么时候最重要?

最佳答案

最坏情况的后果是哈希表无法工作。例如,假设您有一个像这样的简单类:

public class StringWrapper {
private String value;
...
public boolean equals(Object other) {
// two objects are equal if their respective values are equal ... using `equals`.
}
// No hashcode override.
}

这里我们有一个类,我们有一个类不遵守 equals/hashcode 契约所需的不变量之一。具体来说,两个实例可能相等,但具有不同的哈希码。

当您将此类的两个不同实例添加到 HashSet 时,您可能最终会在集合中得到两个实例......位于不同的哈希链上。当从集合中删除对象、测试集合是否包含对象等时,您会遇到类似的异常。

(请注意,您可能会很幸运,尽管具有不同的哈希码,但两个实例最终会位于同一个哈希链上。但是,当其他一些不相关的对象添加到哈希表中时,您的运气可能会改变,导致其自动调整大小.调整大小容易导致不同哈希码的条目重新分配到不同的哈希链。)

<小时/>

So I'm wondering... when is the hashcode most important ?

它总是很重要。

或者换句话说,只有当您 100% 确定该类的实例永远不会在哈希表中使用时,这才变得不重要。 (我不知道你怎么知道这一点,除非你删除该类的所有副本。这使得整个问题变得毫无意义!)

<小时/>

更新

@supercat 提到了你无法编写像样的哈希码的情况。

如果有充分的理由你不能编写一个不太好的 hashcode() 方法,我建议重写它以抛出 UnsupportedOperationException 或类似的问题。这样,如果有人尝试将实例放入哈希表中,您会遇到快速失败......而不是神秘的性能黑洞。 (我不建议返回常量哈希码。)

在一个相关的场景中,您可能会这样做:当对象本质上是可变的,并且您希望避免如果您改变哈希键以使其哈希码发生变化,则会发生不良情况。

关于java - 相等的对象 = 相等的哈希码结果,java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8691946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com