2 哈希映射之间的相等性
在我的类的 equals() 方法中,我使用一个私有实例 HashMap 变量来比较相等性。但是,2个不同的对象在比较其HashMap变量时仍然显示为相等。进一步的研究把我带到了链接: 链接 这里 .然而,它只是说HashMap1.equals(HashMap2)不起作用的原因是因为“显然,如果不编写自定义代码,Java的数组就无法测试其相等性。
我不明白这个原因。任何人都可以指导我一个详细的理由吗?
在我的类的 equals() 方法中,我使用一个私有实例 HashMap 变量来比较相等性。但是,2个不同的对象在比较其HashMap变量时仍然显示为相等。进一步的研究把我带到了链接: 链接 这里 .然而,它只是说HashMap1.equals(HashMap2)不起作用的原因是因为“显然,如果不编写自定义代码,Java的数组就无法测试其相等性。
我不明白这个原因。任何人都可以指导我一个详细的理由吗?
Java 数组类型上的方法等效于 ,因为 Java 数组“类”不会重写 。equals
==
Object.equals
如果要“按值”比较数组,则需要使用适当的方法或自己实现它。java.util.Arrays.equals(...)
如果使用数组作为键或值,则它将调用数组的方法来测试两个映射之间的键和/或值是否相同。这将使行为变得奇怪(从你的角度来看)。这就是链接文章所说的。但是,数组语义仅在使用数组作为键或值类时才影响相等性。如果你不这样做,那么应该按预期工作。HashMap
equals
HashMap.equals
HashMap
HashMap::equals
用于类相等的javadocs有点涉及,但它们基本上归结为采用两个条目集,比较它们的大小,然后做。当然,这很昂贵,但它应该适用于所有正确实现接口的类。Map
s1.containsAll(s2)
Map
Map
请注意,使用数组作为映射的键是一个坏主意,原因如下:
equals
hashCode
HashMap
equals
hashcode
文章是对的。可以使用 equals() 方法安全地比较哈希映射,只要可以使用相同的方法比较键对象和值对象即可。在本文中,映射值是数组,它们不按预期实现 equals()。使用ArrayList可以解决这个问题。