Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么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 - Fatal编程技术网

为什么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实现了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都定

为什么java使用这两种不同的方法?是否有与集合和列表的特性相关的内容? 为什么它使用31而不是其他数字?
谢谢

集合是无序的,因此
{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;
}