key 的 hash code 怎么取决于 Hash map 的容量
How come hash code of key depends up on the capacity of the Hash map
当Hash map以load factor(.75)的比例填充时,如果超过该比例,容量将翻倍并发生rehashing,导致条目重新排列。
在这种情况下,为什么任何键的哈希码都取决于哈希图的容量,从而发生重排?如果任何键的散列码是 10(比方说),当散列映射的容量发生变化时,它怎么会受到影响。
当 HashMap
的容量增长时,hashCode
不会改变。但是,当您必须将值为(例如)503 的 hashCode
映射到(例如)64 个桶的 HashMap
时,您可以使用模数运算符(即 hashCode() % 64
),这会将您映射到存储桶 #55。
当 HashMap
的容量加倍到 128 个桶时,对相同的 hashCode
(这次 hashCode() % 128
)应用取模运算符将映射相同的 hashCode
到另一个桶(桶 #119)。
我稍微简化了答案。模数不直接应用于 hashCode
。它应用于在 hashCode
上应用另一个内部哈希函数的结果。但这并没有改变解释。
基本上你的桶索引是基于你的哈希映射容量的大小。根据 java 文档方法 indexFor return 桶索引即
static 到 indexFor(int h, int length){
return h & (长度-1)
}
当Hash map以load factor(.75)的比例填充时,如果超过该比例,容量将翻倍并发生rehashing,导致条目重新排列。
在这种情况下,为什么任何键的哈希码都取决于哈希图的容量,从而发生重排?如果任何键的散列码是 10(比方说),当散列映射的容量发生变化时,它怎么会受到影响。
当 HashMap
的容量增长时,hashCode
不会改变。但是,当您必须将值为(例如)503 的 hashCode
映射到(例如)64 个桶的 HashMap
时,您可以使用模数运算符(即 hashCode() % 64
),这会将您映射到存储桶 #55。
当 HashMap
的容量加倍到 128 个桶时,对相同的 hashCode
(这次 hashCode() % 128
)应用取模运算符将映射相同的 hashCode
到另一个桶(桶 #119)。
我稍微简化了答案。模数不直接应用于 hashCode
。它应用于在 hashCode
上应用另一个内部哈希函数的结果。但这并没有改变解释。
基本上你的桶索引是基于你的哈希映射容量的大小。根据 java 文档方法 indexFor return 桶索引即
static 到 indexFor(int h, int length){ return h & (长度-1) }