【发布时间】:2012-11-15 06:01:16
【问题描述】:
所以我有这个方法可以将对象添加到显示中。首次打开显示时,所有现有对象都会被 1 个 1 添加到 HashMap 中。之后用户可以添加更多,一次添加 1 个,这会将新对象放入 HashMap。
Key 是 Object,Value 是一个自定义类,其中包含 Object 和一些关于它的其他变量。
这一切都很好,但是当显示器关闭并打开一个新实例时,它应该重新加载所有对象(包括用户在使用期间创建和保存的对象),但出于某种原因新创建的,在执行 containsKey 时会发现不正确的匹配项。
我真的不明白为什么它不应该找到匹配项。当我执行 containsValue 时,它没有找到任何不正确的匹配项(它应该正常工作)但它没有帮助,因为当我使用 HashMap.put(K, V) 时,它会覆盖它会为 containsKey 返回误报的匹配项.
代码所做的只是遍历每个对象,检查 HashMap 是否已经包含键,如果包含则返回键的值,否则根据传递给方法的键创建一个值并将其放入哈希图。
很抱歉,我无法发布代码,所以如果您没有它就无法提供帮助,我理解,但这是为了工作,我不确定是否可以发布代码,即使它只是一个 sn -p。
任何帮助或指导将不胜感激,我仍在谷歌上搜索以查看是否可以找到任何信息。
编辑:我找到了解决方案。 hashcode 函数返回的值本质上是一个索引。问题是它在初始对象之后被重置,因此新添加的对象将从零开始覆盖现有对象。我修改了哈希码及其工作方式。
感谢大家的帮助。
【问题讨论】:
-
如果是为了工作,那就不要贴实际代码了,但是可以写个小代码sn-p,演示一下你实际在做什么。
-
我发布了我认为重要部分的修改后的 sn-p。
-
@user18554575.. 你的
node.getUserObject返回什么? -
只是与节点关联的对象。本质上,它应该与 Object 类相同,但没有父类 isFilterGroup 和 isThecurrentEnum 。
-
关于您的编辑:这不是完整的修复。
hashCode的不同值将阻止HashMap将两个对象视为相等,但HashMap总是 也会检查equals方法。因此,如果更改hashCode似乎可以解决问题,那么这意味着您的equals方法也已损坏,仍然需要修复!
标签: java hash map false-positive containskey