gpt4 book ai didi

java - 如果我不想将我的对象用作哈希表中的键,为什么两个相等的对象应该返回相等的哈希码?

转载 作者:行者123 更新时间:2023-11-29 10:11:37 26 4
gpt4 key购买 nike

这是Object.hashCode()的Java文档说:

If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

但他们没有解释为什么两个相等的对象必须返回相等的散列码。为什么 Oracle 工程师决定在覆盖 equals 时必须覆盖 hashCode

equals 的典型实现不调用hashCode 方法:

@Override
public boolean equals(Object arg0) {
if (this == arg0) {
return true;
}
if (!(arg0 instanceof MyClass)) {
return false;
}
MyClass another = (MyClass) arg0;
// compare significant fields here
}

Effective Java(第 2 版) 中,我读到:

Item 9: Always override hashCode when you override equals.

A common source of bugs is the failure to override the hashCode method. You must override hashCode in every class that overrides equals. Failure to do so will result in a violation of the general contract for Object.hashCode, which will prevent your class from functioning properly in conjunction with all hash-based collections, including HashMap, HashSet, and Hashtable.

假设我不需要使用 MyClass 作为哈希表的键。在这种情况下,为什么我需要覆盖 hashCode()

最佳答案

当然,如果您有一个仅由您自己编写的小程序,并且每次使用外部库时都检查它不依赖于 hashCode(),那么您可以忽略所有这些警告。但是,当软件项目增长时,您将使用外部库,而这些库将依赖于 hashCode(),您将浪费大量时间寻找错误。或者在较新的 Java 版本中,一些其他类也使用 hashCode(),您的程序将失败。

因此,实现它并遵循这个简单的规则要容易得多,因为现代 IDE 可以通过单击自动生成 equalshashCode

更新一个小故事:在工作中,我们在很多类中也忽略了这条规则,只实现了最需要的equalscompareTo。总有一天会发生一些奇怪的事情,因为一位程序员在 GUI 中使用了 Hash*-Class 而我们的对象没有遵循这个规则。最后,学徒需要搜索所有具有equals 的类,并且必须添加相应的hashCode 方法。

关于java - 如果我不想将我的对象用作哈希表中的键,为什么两个相等的对象应该返回相等的哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32034394/

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