2012-11-27 76 views
1

所以我有这种将对象添加到显示的方法。当第一次打开显示器时,所有现有的对象都将被加入到HashMap 1中。然后,用户可以添加更多,每次1个,将一个新对象放入HashMap中。Java Hash Map containsKey在返回true时不会返回true

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

这一切都可以正常工作,但是当显示屏关闭并打开一个新实例时,它应该重新加载所有对象(包括用户在创建和保存期间使用的对象),但出于某种原因新创建的人在使用containsKey时发现不正确的匹配。

我不明白为什么它找不到匹配。当我做的containsValue它没有发现任何不正确的匹配(它的工作原理应该),但它没有帮助,因为当我使用HashMap.put(K,V)它覆盖了它将返回containsKey的误报。

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

对不起,我不能发布代码,所以如果你不能没有它的帮助我明白,但它的工作,我不知道是否可以发布的代码,即使它只是一个片段。

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

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

感谢大家的帮助。

+1

如果是为了工作,那么不要发布实际的代码,但你可以写一个小的代码片段,展示你实际上在做什么。 –

+0

我发布了一个我认为是重要组成部分的修改代码片段。 – user1855475

+0

@ user18554575 ..你的'node.getUserObject'返回了什么? –

回答

5

好像你已经在你的课程中忽略了equals方法,但不是hashCode方法。

需要注意的是,如果你在你的HashMap使用custom class对象作为重点,确保你的类会覆盖equalshashCode方法,否则你将永远无法再找到在HashMapkey

如果覆盖equals但不hashCode,那么你的keys根据您equals方法可能是平等的,但其hashCode将从Object类的方法,它产生的情况下,不同的hashCode的hashCode方法产生。

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

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

+1

此外,键应该是不可变的 - 如果您改变用作键的对象的状态以影响“equals”和“hashCode”的结果,那么地图会变得混乱,并且您会得到不可预知的结果。 – Jesper

+0

回复:“好像你没有在你的班级中重写'equals'和'hashCode'方法”:我认为你有这种落后。看来这个类*已经*重写了这些方法;如果没有,那么'HashMap'实际上就是'IdentityHashMap','containsKey'永远不会返回任何误报。 – ruakh

+0

@ruakh ..是的,其实我错过了。编辑我的psot。 –

1

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

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

这样你可以使用.containsKey()传递这个属性作为参数。

+0

当提示添加一个名字时,它们必须有一个唯一的名字新的,我可以尝试改变它,但是有一些基础设施需要考虑。 – user1855475