Java:AbstractSet与AbstractList的哈希代码

Java:AbstractSet与AbstractList的哈希代码,java,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()); } int h = 0; Iterator<E> i = iterator(); while

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

 int hashCode = 1;
 Iterator<E> i = list.iterator();
 while (i.hasNext()) {
     E obj = i.next();
     hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
 }
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
    E obj = i.next();
    if (obj != null)
        h += obj.hashCode();
}
int hashCode=1;
迭代器i=list.Iterator();
while(i.hasNext()){
E obj=i.next();
hashCode=31*hashCode+(obj==null?0:obj.hashCode());
}
而对于AbstractSet,其计算如下:

 int hashCode = 1;
 Iterator<E> i = list.iterator();
 while (i.hasNext()) {
     E obj = i.next();
     hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
 }
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
    E obj = i.next();
    if (obj != null)
        h += obj.hashCode();
}
inth=0;
迭代器i=迭代器();
while(i.hasNext()){
E obj=i.next();
如果(obj!=null)
h+=obj.hashCode();
}

问:为什么AbstractList的哈希代码计算不能与AbstractSet的哈希代码计算相同?这与
列表
中可能的元素重复与
集合
中的唯一元素保证有关吗?还是与
有序
未有序
的属性有关?

绝对。在
列表
界面中指定的哈希代码计算可能会导致两个列表的
哈希代码()
以不同方式排序的相同元素将不同。
Set
接口中指定的散列码保证两个
Set
s具有不同顺序的相同元素的散列码是相同的


这自然与
列表
集合

的不同平等概念相对应。在
列表
界面中指定的哈希代码计算可能会导致两个列表的
哈希代码()
以不同方式排序的相同元素将不同。
Set
接口中指定的散列码保证两个
Set
s具有不同顺序的相同元素的散列码是相同的


这自然与
List
Set

的不同平等概念相对应。你在写作上比我强,所以我不会提供dup答案。这是对的。正如您在set中看到的,它只是添加每个元素的hashcode——排序在求和(交换属性)方面没有区别——正如海报所提到的,两个具有不同顺序的smae元素的集合被认为是相同的(在数学原理中)。对于列表,以不同顺序拥有相同元素是唯一的列表。31*散列码实际上是一种“位移位”技巧,在添加下一个元素的散列之前“随机化”位,以提供更好的唯一性。@实际上,要确保更好的唯一性,使用的数字必须是素数(和奇数,这是一种冗余)。31是常用的,在这里也可以。作为旁注,我已经阅读了一些案例,其中数字越大越好(即,
String
,如果我没有弄错的话)。你抢先写了,所以我不会提供dup答案。这是对的。正如您在set中看到的,它只是添加每个元素的hashcode——排序在求和(交换属性)方面没有区别——正如海报所提到的,两个具有不同顺序的smae元素的集合被认为是相同的(在数学原理中)。对于列表,以不同顺序拥有相同元素是唯一的列表。31*散列码实际上是一种“位移位”技巧,在添加下一个元素的散列之前“随机化”位,以提供更好的唯一性。@实际上,要确保更好的唯一性,使用的数字必须是素数(和奇数,这是一种冗余)。31是常用的,在这里也可以。作为旁注,我已经阅读了一些案例,其中数字越大越好(例如,
String
,如果我没有弄错的话)。