簡體   English   中英

2 HashMap 之間的相等性

[英]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類。


請注意,使用數組作為映射的鍵是一個壞主意,原因如下:

  1. 在大多數情況下,對於HashMap ,數組equalshashCode的語義是錯誤的。 對於大多數用例,您需要映射按值而不是對象標識來比較鍵。
  2. 數組是可變的。 如果我們假設有一種解決方法來解決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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM