当前位置: 首页 > 知识库问答 >
问题:

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

郦祺
2023-03-14

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

如果根据equals(Object)方法,两个对象相等,那么对两个对象中的每一个调用hashCode方法都必须产生相同的整数结果。

但是他们没有解释为什么两个相等的对象必须返回相等的哈希码。为什么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
}

在《有效Java》(第二版)中,我读到:

第9项:当重写Equals时,始终重写hashCode。

bug的一个常见来源是无法重写hashCode方法。必须在重写Equals的每个类中重写hashCode。不这样做将导致违反Object.HashCode的通用约定,这将阻止您的类与所有基于哈希的集合(包括HashMap、HashSet和HashTable)一起正常工作。

假设我不需要使用myclass作为哈希表的键。为什么在这种情况下需要重写hashcode()

共有1个答案

林星华
2023-03-14

显然,如果没有人调用类的hashcode方法,就没有人知道它与equals不一致。您能保证在项目的持续时间内,包括在维护期间,没有人需要,比如说,从列表中删除重复的对象,或者将一些额外的数据与您的对象相关联吗?

实现hashcode使其与equals一致可能更安全。这不是特别难,总是返回0已经是一个有效的实现。

(请不要只返回0)

 类似资料:
  • 问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一

  • 问题内容: 我明白为什么为两个相等的(通过)对象提供相同的哈希码很重要。但是反之亦然,如果两个对象具有相同的哈希码,它们必须相等吗?合同还存在吗?我找不到一个可能发生这种情况的示例,因为如果所有使用equals方法的属性都被用来覆盖hashcode方法,那么我们将始终对相等的对象使用相同的hashcode。请评论。 问题答案: 如果两个对象相同,则它们不一定相等。否则,您将发现完美的哈希函数。 但

  • 我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。

  • 问题内容: 我正在阅读Java 1.6 API提供的HashMap类的代码,无法完全理解以下操作的需要(位于put和get方法的主体中): 该方法具有以下主体: 通过对提供的哈希码执行位操作,可以有效地重新计算哈希。即使API声明如下,我也无法理解这样做的必要性: 这很关键,因为HashMap使用2的幂的哈希表,否则哈希表在低位无差异时会遇到冲突。 我确实知道键值参数存储在数据结构数组中,并且该数

  • 据我所知,两个不相等的对象可以具有相同的哈希代码。当添加或从HashMap java中检索时,将如何处理这个问题?

  • 我正在尝试使用方法,但它正在重新生成类的对象哈希代码,例如: 但是,我可以检索用户。没有任何问题和所有关系的专业知识: 这是我的Gson方法: 这是我的MyTypeAdapter: } 那么,如何让实际返回一个Json字符串,以便我可以使用Gson. FromJson在我的另一端?提前谢谢。