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

vzgqcmou  于 2023-03-16  发布在  Java
关注(0)|答案(6)|浏览(122)

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

class A {
  private List<Object> list;
}

假设列表的每个元素都有一个正确的hashCode(),如何正确地为列表定义一个哈希函数?

dm7nw8vv

dm7nw8vv1#

如果实际的List实现与接口完全一致,那么提供的hashCode实现就足够了:
返回此列表的哈希代码值。列表的哈希代码定义为以下计算的结果:

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

(List文件)
List接口要求一致的实现根据列表的元素提供equals,因此,他们必须明确地指定hashCode算法

oiopk7p5

oiopk7p52#

为什么要为列表定义hashCode,而它已经实现了(和equals一起)?
(当然前提是它是java.util.List--如果不是,上面的链接会向您展示可以用于您自己的列表类型的确切实现。)

rkue9o1l

rkue9o1l3#

列表的哈希码由List的List接口定义。它可以用作对象哈希码的一部分,尽管有几种情况你可能不想使用它--如果你的列表元素有一个昂贵的哈希码函数,或者如果列表可以保存对对象的引用,如果使用列表的算法,你会得到堆栈溢出。在这种情况下,仅使用列表的长度或另一散列值。

mdfafbf1

mdfafbf14#

在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;
nwsw7zdq

nwsw7zdq5#

你不愿意做的具体原因:

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

比如:

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

cig3rfwq6#

也许问题应该是“如何计算包含列表的对象的散列码”。

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

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

相关问题