[英]How to properly define hash function for a list of objects?
我有一個包含對象列表的數據結構,如下所示:
class A {
private List<Object> list;
}
假設列表的每個元素都有正確的hashCode()
,如何正確定義列表的 hash function ?
為什么要為列表定義hashCode
,當它已經實現時 (以及equals
)?
(當然它是java.util.List
- 但如果沒有,上面的鏈接會顯示您可以用於自己的列表類型的確切實現。)
你不會做的任何具體原因:
Arrays.hashCode(<cast list to array>);
就像是:
Arrays.hashCode((String []) myList.toArray());
列表的哈希碼由List的List接口定義。 這可以用作對象的哈希代碼的一部分,盡管在某些情況下您可能不想使用它 - 如果列表的元素具有昂貴的哈希代碼函數,或者列表可以包含引用對象,如果使用列表的算法,您將獲得堆棧溢出。 在這種情況下,只需使用列表的長度或其他哈希值。
在Java庫中, List
實現( LinkedList
, ArrayList
)使用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.