【发布时间】:2015-07-28 15:07:14
【问题描述】:
当Hash map被填充到负载因子(.75)的比例时,如果超过了,容量会翻倍,并发生rehashing,导致条目重新排列。
在这种情况下,为什么任何键的哈希码取决于哈希映射的容量,从而发生重排?如果任何键的哈希码是 10(比如说),当哈希映射的容量发生变化时,它怎么会受到影响。
【问题讨论】:
标签: java collections hashmap
当Hash map被填充到负载因子(.75)的比例时,如果超过了,容量会翻倍,并发生rehashing,导致条目重新排列。
在这种情况下,为什么任何键的哈希码取决于哈希映射的容量,从而发生重排?如果任何键的哈希码是 10(比如说),当哈希映射的容量发生变化时,它怎么会受到影响。
【问题讨论】:
标签: java collections hashmap
HashMap 的容量增加时,hashCode 不会改变。但是,当您必须将值为(例如)503 的hashCode 映射到(例如)64 个桶的HashMap 时,您使用模数运算符(即hashCode() % 64),它将您映射到桶#55.
当HashMap 的容量翻倍到 128 个桶时,对同一 hashCode(这次是 hashCode() % 128)应用模运算符会将同一 hashCode 映射到不同的桶(桶 #119) .
我稍微简化了答案。模数不直接应用于hashCode。它应用于在hashCode 上应用另一个内部散列函数的结果。但这并没有改变解释。
【讨论】:
基本上,您的存储桶索引基于您的哈希映射容量的大小。根据java doc方法indexFor返回桶索引即
静态转换为 indexFor(int h, int length){ 返回 h & (length-1) }
【讨论】: