equalsJava数组类型上的方法等效于
==,因为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
/hashpre
问题的解决方法,则 仍 可以通过修改数组键来破坏映射的不变式。



