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

问题描述 投票:0回答:6

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

class A {
  private List<Object> list;
}

假设列表的每个元素都有正确的

hashCode()
?

如何正确定义列表的哈希函数
java algorithm hash
6个回答
15
投票

如果实际的

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
算法


2
投票

你为什么要为你的列表定义

hashCode
,当它已经实施(连同
equals
)?

(前提是它当然是

java.util.List
- 但如果不是,上面的链接会向您展示可用于您自己的列表类型的确切实现。)


0
投票

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


0
投票

在Java库中,

List
实现(
LinkedList
ArrayList
)使用
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;

0
投票

您不这样做的任何具体原因:

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

类似的东西:

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

0
投票

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

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

  // ... don't forget to implement custom equals ...
}
© www.soinside.com 2019 - 2024. All rights reserved.