// this is the hashCode method of Set
public int hashCode() {
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();
if (obj != null)
h += obj.hashCode();
}
return h;
}
//this is the hashCode method of List
public int hashCode() {
int hashCode = 1;
for (E e : this)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
return hashCode;
}
为什么java使用这两种不同的方法?有什么与Set和List的特征有关吗? 为什么它使用31而不是其他数字? 谢谢!
答案 0 :(得分:5)
集合是无序的,因此{a, b, c}
必须与{c, b, a}
具有相同的哈希码。添加是可交换的,因此添加元素'hashCodes会为您提供该属性。
列表是有序的,因此虽然[a, b, c]
可能与[c, b, a]
具有相同的哈希码,但它不需要 - 而且如果它没有更好但是,因为尽可能多的不相等的对象应该尝试使用不相等的hashCodes。 ArrayList.hashCode实现具有该属性。
请注意,Set和List都定义了实现必须如何定义equals
和hashCode
(Set.hashCode
,List.hashCode
),因此这些相应集合的任何(兼容)实现都是看起来几乎一样。这为您提供了有用的属性,即包含相同元素的Set与任何其他Set相同(因此具有相同的hashCode),无论底层实现如何。