Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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 为什么密钥的哈希代码取决于哈希映射的容量_Java_Collections_Hashmap - Fatal编程技术网

Java 为什么密钥的哈希代码取决于哈希映射的容量

Java 为什么密钥的哈希代码取决于哈希映射的容量,java,collections,hashmap,Java,Collections,Hashmap,当哈希映射按加载因子(.75)的比例填充时,如果超出该比例,容量将加倍,并发生重新灰化,从而导致条目重新排列 在这种情况下,为什么任何密钥的哈希代码都取决于哈希映射的容量,从而发生重新排列?如果任何键的散列码是10(比如说),那么当散列映射的容量改变时,它怎么会受到影响呢 当HashMap的容量增加时,hashCode不会改变。但是,当您必须将值为(例如)503的hashCode映射到(例如)64个bucket的HashMap时,您可以使用模数运算符(即hashCode()%64),将您映射到b

当哈希映射按加载因子(.75)的比例填充时,如果超出该比例,容量将加倍,并发生重新灰化,从而导致条目重新排列


在这种情况下,为什么任何密钥的哈希代码都取决于哈希映射的容量,从而发生重新排列?如果任何键的散列码是10(比如说),那么当散列映射的容量改变时,它怎么会受到影响呢

HashMap
的容量增加时,
hashCode
不会改变。但是,当您必须将值为(例如)503的
hashCode
映射到(例如)64个bucket的
HashMap
时,您可以使用模数运算符(即
hashCode()%64
),将您映射到bucket#55

HashMap
的容量加倍到128个存储桶时,对同一
hashCode
应用模运算符(这次
hashCode()%128
)将把同一
hashCode
映射到不同的存储桶(存储桶119)


我把答案简化了一点。模数不直接应用于
hashCode
。它应用于对
hashCode
应用另一个内部哈希函数的结果。但这并没有改变解释。

基本上,存储桶索引是基于哈希映射容量的大小。根据java文档方法index返回桶索引,即

静态转换为indexFor(整数h,整数长度){ 返回h&(长度-1) }