Java:AbstractSet与AbstractList的哈希代码
对于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
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
,如果我没有弄错的话)。