我浏览了HashMap的源代码,并提出了一些问题. PUT方法采用Key和Value
>密钥哈希码的哈希函数.
>使用从上一步骤获得的哈希计算该对的桶位置
public V put(K key, V value) {
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
.....
}
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
static int indexFor(int h, int length) {
return h & (length-1);
}
例:
>创建大小为10的HashMap.
>调用put(k,v)三次并假设这3个占用桶位7,8和9
>调用put第4 K,V对以及后续发生
>使用key.hashcode()调用hash()并计算哈希值
> indexFor基于哈希计算
题:
>如果计算出的第4个k,v的铲斗位置超出现有界限怎么办?说位置11?
提前致谢
AKH
解决方法:
对于你的第一个问题:地图总是使用2的幂来表示大小(如果你给它一个10的容量,它实际上会使用16),这意味着索引& (长度 – 1)将始终在[0,长度]范围内,因此它始终在范围内.
目前尚不清楚你的第二个和第三个问题是关于什么的.我不认为HashMap会重新分配所有内容,除非它需要.
标签:java,algorithm,hashmap,data-structures,hash
来源: https://codeday.me/bug/20190630/1331503.html