4

我编写了一个覆盖类 Object 中的 equals(Object) 方法的类,以使用该对象的实例值将该类类型的对象与该类类型的其他对象进行比较。

当我将对象的一个​​实例作为键放在 HashMap 中,然后在地图上调用 get(Object) 并使用一个新的但相同的对象作为键时,它返回 null。

我尝试将一个新的、相同的对象传递给 equals 方法,它返回 true,所以问题不在于我的比较代码。

根据我通过调试收集的信息,我的对象中的 equals(Object) 方法从未被调用过。

但是,如果您在 HashMap 中使用 String 键,然后将具有相同字符的新实例传递给 get(Object),它会成功返回该值。

为什么会这样?我需要做什么才能让 HashMap 测试键基于我的 equals 方法?

4

2 回答 2

11

您还需要覆盖Object.hashcode(). 看一下链接,因为它指定了这一点,hashcode()equals()有一个合同来确保HashTable's、HashMap's 和HashSet's 中的正确功能。

在 aHashMap中,值存储在桶中,通过键的哈希码到达桶中。一旦找到合适的桶,然后将equals方法应用于桶的每个成员,直到确定相等。因此,确保您的哈希算法“哈希好”很重要。

于 2012-06-06T18:27:30.433 回答
1

您还应该覆盖 hashCode 否则它将无法工作,因为 HashMap(顾名思义)等同于基于哈希集合的相等性。覆盖equals的Java“荣誉代码”是您还应该同时覆盖hashCode。

于 2012-06-06T18:28:50.923 回答