[英]Equality between 2 HashMap
在我的類的 equals() 方法中,我使用私有實例 HashMap 變量來比較相等性。 但是,在比較它們的 HashMap 變量時,兩個不同的對象仍然顯示相等。 進一步的研究把我帶到了鏈接: Link Here 。 但是,它只是說 HashMap1.equals(HashMap2) 不起作用的原因是因為“如果不編寫自定義代碼,顯然無法測試 Java 的數組是否相等。”
我不明白這個原因。 誰能指導我一個詳細的原因?
Java 數組類型的equals
方法等價於==
,因為 Java 數組“類”不會覆蓋Object.equals
。
如果您想“按值”比較數組,您需要使用適當的java.util.Arrays.equals(...)
方法,或者自己實現它。
如果您的HashMap
使用數組作為鍵或值,那么它將調用數組的equals
方法來測試兩個映射之間的鍵和/或值是否相同。 這會使HashMap.equals
行為異常(從您的角度來看)。 這就是鏈接文章所說的。 但是,如果使用數組作為鍵或值類,數組語義只會影響HashMap
相等性。 如果你不這樣做,那么HashMap::equals
應該可以按預期工作。
Map
類上的相等性的 javadocs 有點涉及,但它們基本上歸結為獲取兩個條目集,比較它們的大小,然后執行s1.containsAll(s2)
。 當然,這很昂貴,但它應該適用於正確實現Map
接口的所有Map
類。
請注意,使用數組作為映射的鍵是一個壞主意,原因如下:
HashMap
,數組equals
和hashCode
的語義是錯誤的。 對於大多數用例,您需要映射按值而不是對象標識來比較鍵。equals
/ hashcode
問題,您仍然可以通過修改數組鍵來破壞映射的不變量。文章是對的。 只要可以使用相同的方法比較鍵對象和值對象,就可以使用 equals() 方法安全地比較 Hashmap。 在文章中,map 值是數組,沒有按預期實現 equals()。 改用 ArrayList 可以解決問題。
本機 Java 數組沒有 .equals() 函數。 因此,如果您的哈希圖的值(或我想的鍵)是數組,則 HashMap.equals() 將失敗。 我懷疑它會回到 Object.equals() 上,它只是檢查兩個對象是否實際上是同一個對象。
// something like this
class Object {
public boolean equals( Object o) {
return this == o;
}
}
您可以通過在容器上使用一些變體而不是數組 [] 來回避這個問題,因為容器有自己的 .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
工作方式不同的一個特例,具體取決於它是否被覆蓋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.