2个HashMap之间的相等性

新手上路,请多包涵

在我的类的 equals() 方法中,我使用私有实例 HashMap 变量来比较相等性。然而,当比较它们的 HashMap 变量时,2 个不同的对象仍然显示相等。进一步的研究将我带到了链接: Link Here 。但是,它只是说 HashMap1.equals(HashMap2) 不起作用的原因是因为“显然,如果不编写自定义代码,就无法测试 Java 数组的相等性。”

我不明白这个原因。谁能指导我详细说明原因?

原文由 name_masked 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 414
2 个回答

Java 数组类型上的 equals 方法等效于 == ,因为 Java 数组“类”不会覆盖 Object.equals

如果你想“按值”比较数组,你需要使用适当的 java.util.Arrays.equals(...) 方法,或者自己实现它。

如果您的 HashMap 使用数组作为键或值,那么它将调用数组的 equals 方法来测试两个映射之间的键和/或值是否相同。这会使 HashMap.equals 行为异常(从您的角度来看)。这就是链接文章所说的。但是,数组语义 影响 HashMap 如果您使用数组作为键或值类的相等性。如果您不这样做,那么 HashMap::equals 应该会按预期工作。

关于 Map 类的平等的 javadocs 有点复杂,但它们基本上归结为获取两个条目集,比较它们的大小,然后执行 s1.containsAll(s2) 。当然,这很昂贵,但它 应该 适用于正确实现 Map 接口的所有 Map 类。


请注意,出于以下几个原因,使用数组作为映射的键不是一个好主意:

  1. 在大多数情况下,数组 equalshashCode HashMap 错误的。对于大多数用例,您需要映射按值而不是对象标识来比较键。
  2. 数组是可变的。如果我们假设 equals / hashcode 问题有解决方法,您 仍然 可以通过修改数组键来破坏地图的不变量。

原文由 Stephen C 发布,翻译遵循 CC BY-SA 4.0 许可协议

这篇文章是对的。只要可以使用相同的方法比较键对象和值对象,就可以使用 equals() 方法安全地比较哈希图。在文章中,映射值是数组,没有按预期实现 equals()。使用 ArrayList 而不是可以解决问题。

原文由 Eyal Schneider 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题