在说扩容之前,首先问个问题。
new HashMap<>(13);
在构造方法传入13的时候,hashMap初始化的容量是多少呢?
答案是16
先来看看JDK8的算法。我觉得JDK8的算法是比较好理解的
1.JDK8
//MAXIMUM_CAPACITY=1<<30
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
这个算法很好理解。就是找出第一个1的位置,将1补满再加一。得出结果
2.JDK6
看完8的算法,再来看6就好理解多了,这里就是计算出1往右边移动了多少位。然后计算出结果。原理大体上相似。



