在我的类的 equals() 方法中,我使用私有实例 HashMap 变量来比较相等性。然而,当比较它们的 HashMap 变量时,2 个不同的对象仍然显示相等。进一步的研究将我带到了链接: Link Here 。但是,它只是说 HashMap1.equals(HashMap2) 不起作用的原因是因为“显然,如果不编写自定义代码,就无法测试 Java 数组的相等性。”
我不明白这个原因。谁能指导我详细说明原因?
原文由 name_masked 发布,翻译遵循 CC BY-SA 4.0 许可协议
Java 数组类型上的
equals
方法等效于==
,因为 Java 数组“类”不会覆盖Object.equals
如果你想“按值”比较数组,你需要使用适当的
java.util.Arrays.equals(...)
方法,或者自己实现它。如果您的
HashMap
使用数组作为键或值,那么它将调用数组的equals
方法来测试两个映射之间的键和/或值是否相同。这会使HashMap.equals
行为异常(从您的角度来看)。这就是链接文章所说的。但是,数组语义 仅 影响HashMap
如果您使用数组作为键或值类的相等性。如果您不这样做,那么HashMap::equals
应该会按预期工作。关于
Map
类的平等的 javadocs 有点复杂,但它们基本上归结为获取两个条目集,比较它们的大小,然后执行s1.containsAll(s2)
。当然,这很昂贵,但它 应该 适用于正确实现Map
接口的所有Map
类。请注意,出于以下几个原因,使用数组作为映射的键不是一个好主意:
equals
和hashCode
HashMap
错误的。对于大多数用例,您需要映射按值而不是对象标识来比较键。equals
/hashcode
问题有解决方法,您 仍然 可以通过修改数组键来破坏地图的不变量。