HashMap没有调用Object.equals?

时间:2012-06-06 18:25:31

标签: java object collections hashmap

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

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

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

从我通过调试收集到的内容,我的对象中的equals(Object)方法永远不会被调用。

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

为什么会这样?如何根据MY equals方法获取HashMap测试密钥?

2 个答案:

答案 0 :(得分:10)

您还需要覆盖Object.hashcode()。请查看该链接,因为它指定hashcode()equals()签订合同以确保HashTableHashMap和{{1}的正常功能}}的

HashSet中,值存储在桶中,这些桶由密钥的哈希码到达。找到合适的存储桶后,将equals方法应用于存储桶的每个成员,直到确定相等为止。因此,确保您的哈希算法“哈希”很重要。

答案 1 :(得分:1)

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