Java哈希映射containsKey在不应该返回true的情况下返回true



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

Key是Object,Value是一个自定义类,包含Object和其他几个变量

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

我真的不明白为什么它在不该找到匹配的时候却找到了匹配。当我使用containsValue时,它不会发现任何不正确的匹配(它正常工作),但它没有帮助,因为当我使用HashMap.put(K,V)时,它会覆盖它本来会为containsKey返回假阳性的匹配。

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

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

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

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

感谢大家的帮助。

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

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

如果覆盖equals而不覆盖hashCode,则基于equals方法,keys可能相等,但其hashCode将由Object类方法的hashCode方法生成,该方法为实例生成不同的hashCode。

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

此外,根据其中一条注释,您应该确保您的Keys是不可变的。

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

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

通过这种方式,您可以使用传递该属性的.containsKey()作为参数。

相关内容

  • 没有找到相关文章

最新更新