我有一个包含对象列表的数据结构,像这样:如何正确定义对象列表的哈希函数?
class A {
private List<Object> list;
}
如何正确地定义一个哈希函数的列表,假定列表中的每个元素有一个正确的hashCode()
?
我有一个包含对象列表的数据结构,像这样:如何正确定义对象列表的哈希函数?
class A {
private List<Object> list;
}
如何正确地定义一个哈希函数的列表,假定列表中的每个元素有一个正确的hashCode()
?
如果实际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
算法
为什么要为您的清单定义hashCode
?当它already has it implemented(以及equals
)?
(前提当然是java.util.List
- 但是如果没有,上面的链接显示您可以使用自己的列表类型的具体实现)
列表的哈希码由列表的List interface定义。这可以用作对象哈希代码的一部分,尽管有些情况下您可能不想使用它 - 如果列表中的元素具有昂贵的哈希代码函数,或者列表中可以存储对该对象,并且如果使用列表的算法,则会发生堆栈溢出。在这种情况下,只需使用列表的长度或另一个散列值即可。
在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;
任何具体原因你刚才不会做:
Arrays.hashCode(<cast list to array>);
喜欢的东西:
Arrays.hashCode((String []) myList.toArray());