2 HashMap之间的相等性


问题内容

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

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


问题答案:

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

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

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

用于Map类平等的javadocs
涉及到一点,但是它们基本上归结为采用两个条目集,比较它们的大小,然后执行s1.containsAll(s2)。当然,这很昂贵,但是它 应该
Map正确实现Map接口的所有类都有效。


请注意,出于以下几个原因,将数组用作映射的键​​是一个坏主意:

  1. 在大多数情况下,数组equals和的语义hashCode对于a是错误的HashMap。对于大多数用例,您需要映射以按值而不是按对象标识比较键。
  2. 数组是可变的。如果我们假设存在针对equals/ hashcode问题的解决方法,则 可以通过修改数组键来破坏映射的不变式。