2 HashMap之间的平等

在我的类的equals()方法中,我使用私有实例HashMap变量来比较相等性。 但是,在比较它们的HashMap变量时,2个不同的对象仍然显示相等。 进一步的研究将我带到了链接: 链接在这里 。 但是,它只是说HashMap1.equals(HashMap2)无法工作的原因是因为“在没有编写自定义代码的情况下,不能对Java的数组进行相同的测试。”

我不明白这个原因。 任何人都可以指导我一个精心设计的原因吗?

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

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

如果你的HashHap使用数组作为键或值,这将使HashMap.equals表现HashHap奇怪(从你的角度来看)。 这就是链接文章所说的内容。 但是,如果将数组用作键或值类,则数组语义影响HashMap相等性。 如果你不这样做,则equals应该按预期工作。

Map类上相等的javadoc有点涉及,但它们基本上归结为取两个入口集,比较它们的大小,然后做s1.containsAll(s2) 。当然,这很昂贵,但它应该工作对于正确实现Map接口的所有Map类。)

这篇文章是对的。 只要可以使用相同的方法比较关键对象和值对象,就可以使用equals()方法安全地比较散列图。 在本文中,映射值是数组,它们没有按预期实现equals()。 相反,使用ArrayList可以解决问题。

本机Java数组没有.equals()函数。 因此,如果您的hashmap的值(或我认为的键)是数组,HashMap.equals()将失败。 我怀疑它会回到Object.equals(),它只是检查两个对象是否实际上是同一个对象。

 // something like this class Object { public boolean equals( Object o) { return this == o; } } 

您可以通过在Container而不是array []上使用某个变量来回避问题,因为容器有自己的.equals(),它在容器的连续元素上调用equals(),而不是简单地检查它们是否是相同的引用。 Collection.equals实现的代码可能类似于:

 public boolean equals(Object o) { // sets never equal lists and visa versa if (o instanceof MyCollectionSubclass) { Iterator myIterator = iterator(); Iterator theirIterator = ((Collection)o).iterator(); while (myIterator.hasNext() && theirIterator.hasNext()) { Object myObj = myIterator.next(); Object theirObj = theirIterator.next(); if (!myObj.equals(theirObj)) { return false; } } // at least one will be false or we wouldn't have left the above while loop return myIterator.hasNext() == theirIterator.hasNext(); } // not our class return false; } 

这可能会产生真正的值比较,具体取决于调用equals()时集合的内容所执行的操作。

如果不编写自定义代码,则无法测试Java的数组是否相等

这只是一种复杂的说法,即Java数组不会覆盖Object.equals() 。 因此,如果使用equals() (这是所有集合类的equals方法equals()来比较它们,则会得到“实例相等”,而不是“值相等”。

这实际上只是equals不同方式的特殊情况,取决于它是否被覆盖。