所以我有了这个方法,可以将对象添加到显示中。当第一次打开显示时,所有现有对象都将以1添加到HashMap 1中。之后,用户可以添加更多,一次添加1,从而将新对象放入HashMap中。
Key是Object,Value是一个自定义类,包含Object和其他几个变量
这一切都很好,但当关闭显示并打开新实例时,它应该重新加载所有对象(包括用户在使用过程中创建和保存的对象),但由于某些原因,对于任何新创建的对象,它在执行containsKey时都会发现不正确的匹配。
我真的不明白为什么它在不该找到匹配的时候却找到了匹配。当我使用containsValue时,它不会发现任何不正确的匹配(它正常工作),但它没有帮助,因为当我使用HashMap.put(K,V)时,它会覆盖它本来会为containsKey返回假阳性的匹配。
所有代码所做的就是遍历每个对象,检查HashMap是否已经包含该键,如果包含,则返回该键的值,否则将根据传递给方法的键创建一个值,并将其放入HashMap中。
很抱歉,我不能发布代码,所以如果你没有它就无能为力,我理解,但这是为了工作,我不确定发布代码是否可以,即使它只是一个片段。
任何帮助或指导都将不胜感激,我仍在谷歌上搜索,看看是否能找到任何信息。
编辑:我找到了一个解决方案。hashcode函数返回的值本质上是一个索引。问题是,它在初始对象之后被重置,因此新添加的对象将从零开始覆盖现有对象。我修改了哈希代码及其工作方式。
感谢大家的帮助。
似乎您在类中覆盖了equals
方法,但没有覆盖hashCode
方法。
请注意,如果在HashMap
中使用custom class
对象作为键,请确保类覆盖equals
和hashCode
方法,否则将永远无法在HashMap
中找到key
。
如果覆盖equals
而不覆盖hashCode
,则基于equals
方法,keys
可能相等,但其hashCode
将由Object
类方法的hashCode
方法生成,该方法为实例生成不同的hashCode。
通常,如果您应该重写both equals and hashCode
方法或override none of them
方法。此外,为了计算hashCodes
,您应该只使用那些在equals
方法中用于比较的属性。
此外,根据其中一条注释,您应该确保您的Keys
是不可变的。
我建议您不要使用自定义对象作为HashMap的键。
这些物体有一些标识吗?某个属性不会从一个对象重复到另一个对象?将HashMap的键更改为此属性。
通过这种方式,您可以使用传递该属性的.containsKey()
作为参数。