2 哈希映射之间的相等性

2022-09-01 20:18:57

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

我不明白这个原因。任何人都可以指导我一个详细的理由吗?


答案 1

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

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

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

用于类相等的javadocs有点涉及,但它们基本上归结为采用两个条目集,比较它们的大小,然后做。当然,这很昂贵,但它应该适用于所有正确实现接口的类。Maps1.containsAll(s2)MapMap


请注意,使用数组作为映射的键是一个坏主意,原因如下:

  1. 数组的语义和在大多数方案中都是错误的。对于大多数用例,您需要映射来按值而不是按对象标识比较键。equalshashCodeHashMap
  2. 数组是可变的。如果我们假设 / 问题有解决方法,您仍然可以通过修改数组键来破坏映射的不变量。equalshashcode

答案 2

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


推荐