如何正确定义对象列表的哈希函数?

时间:2010-06-16 14:55:29

标签: java algorithm hash

我有一个包含对象列表的数据结构,如下所示:

class A {
  private List<Object> list;
}

如果正确定义列表的哈希函数,假设列表中的每个元素都有正确的hashCode()

5 个答案:

答案 0 :(得分:13)

如果实际的List实现完全符合接口,则提供的hashCode实现应该足够了:

  

返回此列表的哈希码值。列表的哈希码被定义为以下计算的结果:

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

List documentation

List接口要求符合要求的实现基于列表的元素提供equals。因此,他们必须明确指定hashCode算法

答案 1 :(得分:2)

为什么要为列表already has it implemented(以及hashCode)定义equals

(当然它是java.util.List - 但如果没有,上面的链接会显示您可以用于自己的列表类型的确切实现。)

答案 2 :(得分:1)

你不愿意做的任何具体原因:

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

类似的东西:

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

答案 3 :(得分:0)

列表的哈希码由List的List interface定义。这可以用作对象的哈希代码的一部分,尽管在某些情况下您可能不想使用它 - 如果列表的元素具有昂贵的哈希代码函数,或者列表可以包含引用对象,如果使用列表的算法,您将获得堆栈溢出。在这种情况下,只需使用列表的长度或其他哈希值。

答案 4 :(得分:0)

在Java库中,List实现(LinkedListArrayList)使用hashCode提供的默认AbstractList实现。其定义为:

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