Java Hash Map containsKey在不应该返回时返回true

时间:2012-11-27 15:14:27

标签: java hash map false-positive containskey

所以我有这个方法将一个对象添加到显示器。首次打开显示时,所有现有对象都会被添加到HashMap 1中1.之后,用户可以一次添加1个,将新对象放入HashMap。

Key是Object,Value是一个自定义类,包含Object和其他几个变量。

这一切都很好但是当关闭显示并打开一个新实例时,它应该重新加载所有对象(包括用户在使用过程中创建和保存的对象),但出于某种原因,任何人都可以在新创建的那个中,它在执行containsKey时找到不正确的匹配。

我真的不明白为什么它不应该找到匹配。当我执行containsValue时,它没有找到任何不正确的匹配(它可以正常工作)但它没有帮助,因为当我使用HashMap.put(K,V)时,它会覆盖它将返回包含密钥的误报的匹配

所有代码都迭代遍历每个对象,检查HashMap是否已包含密钥,如果是,则返回密钥的值,否则根据传入方法的密钥创建一个值并将其放入hashmap。

对不起,我不能发布代码,所以如果没有它我无法帮助我理解,但它的工作,我不确定是否可以发布代码,即使它只是一个片段

任何帮助或指导都将不胜感激,我仍然在谷歌上搜索,看看我是否能找到任何信息。

编辑:我找到了解决方案。 hashcode函数返回一个本质上是索引的值。问题是它在初始对象之后被重置,因此新添加的对象将从零开始覆盖现有对象。我修改了哈希码及其工作原理。

感谢大家的帮助。

2 个答案:

答案 0 :(得分:5)

好像你已经覆盖了equals方法而不是你班级中的hashCode方法。

请注意,如果您使用custom class对象作为HashMap中的密钥,请确保您的班级覆盖equalshashCode方法,否则您会永远无法再次在key中找到HashMap

如果您覆盖equals但不覆盖hashCode,则keys可能会基于您的equals方法相同,但其hashCode将从hashCode类方法的Object方法,为您的实例生成不同的hashCode。

一般情况下,如果您应该覆盖both equals and hashCode方法,或override none of them。另外,为了计算hashCodes,您应该只使用那些用于equals方法中的比较的属性。

另外,从其中一条评论中,您应该确保Keys是不可变的。

答案 1 :(得分:1)

我建议您不要使用自定义对象作为HashMap的键。

这些物品有一些标识吗?一些属性不会从一个对象重复到另一个对象?将HashMap的键更改为此属性。

这样您就可以使用.containsKey()传递此属性作为参数。