为什么Java实现了Set和ArrayList的不同hashcode方法? //这是Set的hashCode方法 公共int hashCode(){ int h=0; 迭代器i=迭代器(); while(i.hasNext()){ E obj=i.next(); 如果(obj!=null) h+=obj.hashCode(); } 返回h; } //这是List的hashCode方法 公共int hashCode(){ int hashCode=1; 对于(E:本) hashCode=31*hashCode+(e==null?0:e.hashCode()); 返回哈希码; }
为什么java使用这两种不同的方法?是否有与集合和列表的特性相关的内容? 为什么它使用31而不是其他数字?为什么Java实现了Set和ArrayList的不同hashcode方法? //这是Set的hashCode方法 公共int hashCode(){ int h=0; 迭代器i=迭代器(); while(i.hasNext()){ E obj=i.next(); 如果(obj!=null) h+=obj.hashCode(); } 返回h; } //这是List的hashCode方法 公共int hashCode(){ int hashCode=1; 对于(E:本) hashCode=31*hashCode+(e==null?0:e.hashCode()); 返回哈希码; },java,hashcode,Java,Hashcode,为什么java使用这两种不同的方法?是否有与集合和列表的特性相关的内容? 为什么它使用31而不是其他数字? 谢谢 集合是无序的,因此{a,b,c}必须具有与{c,b,a}相同的哈希代码。加法是可交换的,所以添加元素的hashcode可以获得该属性 列表是按顺序排列的,因此虽然[a,b,c]可能具有与[c,b,a]相同的哈希代码,但它不需要——如果没有,那就更好了,因为尽可能多的不相等对象应该尝试具有不相等的哈希代码。ArrayList.hashCode实现具有该属性 请注意,Set和List都定
谢谢 集合是无序的,因此
{a,b,c}
必须具有与{c,b,a}
相同的哈希代码。加法是可交换的,所以添加元素的hashcode可以获得该属性
列表是按顺序排列的,因此虽然[a,b,c]
可能具有与[c,b,a]
相同的哈希代码,但它不需要——如果没有,那就更好了,因为尽可能多的不相等对象应该尝试具有不相等的哈希代码。ArrayList.hashCode实现具有该属性
请注意,Set和List都定义了实现必须如何定义
equals
和hashCode
(,),因此这些集合的任何(兼容)实现看起来都差不多。这为您提供了一个有用的属性,即包含相同元素的集合与任何其他集合相等(因此具有相同的哈希代码),而不管底层实现如何。我回答了关于列表与集合的部分,因为我找不到关于此的任何其他问题。但是关于31的问题已经得到了回答:请看,如果您搜索哈希函数为什么使用素数,那么您也可以找到其他答案。
// 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;
}