我有一个包含对象列表的数据结构,如下所示:
class A {
private List<Object> list;
}
假设列表的每个元素都有正确的
hashCode()
?如何正确定义列表的哈希函数
列表的哈希码由List的List接口定义。这可以用作对象哈希码的一部分,尽管在某些情况下您可能不想使用它 - 如果列表的元素具有昂贵的哈希码函数,或者列表可以包含对对象,如果使用列表的算法,您将得到堆栈溢出。在这种情况下,只需使用列表的长度或其他哈希值即可。
在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;
您不这样做的任何具体原因:
Arrays.hashCode(<cast list to array>);
类似的东西:
Arrays.hashCode((String []) myList.toArray());
也许问题应该是“如何计算包含列表的对象的哈希码”。
class A {
private List<Object> list;
@Override
public int hashCode() {
return list.hashCode();
}
// ... don't forget to implement custom equals ...
}