Java:AbstractSet与AbstractList的hashCode

时间:2013-02-08 17:30:30

标签: java

对于AbstractList,哈希码计算如下:

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

而对于AbstractSet,它的计算方法如下:

int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
    E obj = i.next();
    if (obj != null)
        h += obj.hashCode();
}

问题:为什么AbstractList的哈希码计算不能与AbstractSet的哈希码计算相同?这与ListSetordered中的唯一元素保证中的可能元素重复有关,还是与un-ordered与{{1}}属性有关?

1 个答案:

答案 0 :(得分:6)

绝对。 List接口中指定的哈希码计算使得以不同方式排序的具有相同元素的两个列表的hashCode()可能不同。 Set接口中指定的哈希码保证两个Set的哈希码在不同的顺序中具有相同的元素。

这与ListSet的不同平等概念自然对应。