簡體   English   中英

如何為對象列表正確定義 hash function?

[英]How to properly define hash function for a list of objects?

我有一個包含對象列表的數據結構,如下所示:

class A {
  private List<Object> list;
}

假設列表的每個元素都有正確的hashCode() ,如何正確定義列表的 hash function ?

如果實際的List實現完全符合接口,那么提供的hashCode實現就足夠了:

返回此列表的哈希碼值。 列表的哈希碼被定義為以下計算的結果:

hashCode = 1;
  Iterator i = list.iterator();
  while (i.hasNext()) {
      Object obj = i.next();
      hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
  }

列出文件

List接口要求符合要求的實現基於列表的元素提供equals 因此,他們必須明確指定hashCode算法

為什么要為列表定義hashCode ,當它已經實現時 (以及equals )?

(當然它是java.util.List - 但如果沒有,上面的鏈接會顯示您可以用於自己的列表類型的確切實現。)

你不會做的任何具體原因:

Arrays.hashCode(<cast list to array>);

就像是:

Arrays.hashCode((String []) myList.toArray());

列表的哈希碼由List的List接口定義。 這可以用作對象的哈希代碼的一部分,盡管在某些情況下您可能不想使用它 - 如果列表的元素具有昂貴的哈希代碼函數,或者列表可以包含引用對象,如果使用列表的算法,您將獲得堆棧溢出。 在這種情況下,只需使用列表的長度或其他哈希值。

在Java庫中, List實現( LinkedListArrayList )使用AbstractList提供的默認hashCode實現。 其定義為:

int hashCode = 1;
Iterator<E> i = iterator();
while (i.hasNext()) {
    E obj = i.next();
    hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
}
return hashCode;

也許問題應該是“如何計算包含列表的 object 的哈希碼”。

class A {
  private List<Object> list;
  
  @Override
  public int hashCode() {
    return list.hashCode();
  }

  // ... don't forget to implement custom equals ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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