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