1

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

Key 是 Object,Value 是一个自定义类,其中包含 Object 和一些关于它的其他变量。

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

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

代码所做的只是遍历每个对象,检查 HashMap 是否已经包含键,如果包含,则返回键的值,否则根据传递给方法的键创建一个值并将其放入 hashmap 中。

很抱歉,我无法发布代码,所以如果没有它你无法提供帮助,我理解,但它是为了工作,我不确定是否可以发布代码,即使它只是一个片段。

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

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

感谢大家的帮助。

4

2 回答 2

5

似乎您已经覆盖equals了方法,但没有覆盖hashCode您类中的方法。

请注意,如果您将custom class对象用作 中的键,请HashMap确保您的类同时覆盖equalshashCode方法,否则您将永远无法在key其中找到HashMap

如果你 override equalsbut not hashCode,那么你的方法keys可能是相等的equals,但它hashCode会从类方法的方法中生成hashCode,它会Object为你的实例生成不同的 hashCode。

一般来说,如果你应该重写both equals and hashCode方法,或者override none of them. 此外,为了计算,您应该只使用那些在方法hashCodes中用于比较的属性。equals

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

于 2012-11-27T15:16:47.220 回答
1

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

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

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

于 2012-11-27T15:19:40.537 回答