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