HashMap中根据hash值求得index的问题???

1.根据key求index的过程

// 先用key求得hash值
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
// 利用上述函数求取hash值后 然后(n-1)& hash
int hash = hash(key);
index = (n - 1) & hash;

2.为什么HashMap的数组初始化大小为2的次方时,HashMap的效率最高???
首先,HashMap是通过(n-1)&hash方式来获取index值的,如果n不是2的次方,假设n=15,那么(n-1)的二进制位1110,hash会与1110进行与运算,那么最后一位永远是0,而0001,0011,0101,1001,1011,0111,1101这几个位置永远不能存放元素了,控件浪费很大,这就增加了碰撞几率,减小了查询效率。

3.为什么resize为原来的2倍?
当超过限制的时候会resize,使用2次幂扩展,元素的文职要么是在原位置,要么是在原位置再移动2次幂的位置,因此,在扩充HashMap的时候,不需要重新计算hash,只需要看看原来的hash值新增的那一位是否是0,如果是0索引没变,如果是1,索引变成原索引+oldgap,省去了重新计算hash值的时间

猜你喜欢

转载自blog.csdn.net/reuxfhc/article/details/82707776
今日推荐