所以我有这个方法将一个对象添加到显示器。首次打开显示时,所有现有对象都会被添加到HashMap 1中1.之后,用户可以一次添加1个,将新对象放入HashMap。
Key是Object,Value是一个自定义类,包含Object和其他几个变量。
这一切都很好但是当关闭显示并打开一个新实例时,它应该重新加载所有对象(包括用户在使用过程中创建和保存的对象),但出于某种原因,任何人都可以在新创建的那个中,它在执行containsKey时找到不正确的匹配。
我真的不明白为什么它不应该找到匹配。当我执行containsValue时,它没有找到任何不正确的匹配(它可以正常工作)但它没有帮助,因为当我使用HashMap.put(K,V)时,它会覆盖它将返回包含密钥的误报的匹配
所有代码都迭代遍历每个对象,检查HashMap是否已包含密钥,如果是,则返回密钥的值,否则根据传入方法的密钥创建一个值并将其放入hashmap。
对不起,我不能发布代码,所以如果没有它我无法帮助我理解,但它的工作,我不确定是否可以发布代码,即使它只是一个片段
任何帮助或指导都将不胜感激,我仍然在谷歌上搜索,看看我是否能找到任何信息。
编辑:我找到了解决方案。 hashcode函数返回一个本质上是索引的值。问题是它在初始对象之后被重置,因此新添加的对象将从零开始覆盖现有对象。我修改了哈希码及其工作原理。感谢大家的帮助。
答案 0 :(得分:5)
好像你已经覆盖了equals
方法而不是你班级中的hashCode
方法。
请注意,如果您使用custom class
对象作为HashMap
中的密钥,请确保您的班级覆盖equals
和hashCode
方法,否则您会永远无法再次在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()
传递此属性作为参数。