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
不同方式的特殊情况,取决于它是否被覆盖。