对传入容量转换为2的n次幂方法分析
- ConcurrentHashMap中的体现
- 使用带有参数的构造方法时 就会使用转换当前容量为2的n次幂的方法
public ConcurrentHashMap(int initialCapacity) {
if (initialCapacity < 0)
throw new IllegalArgumentException();
int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ?
MAXIMUM_CAPACITY :
tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1));
this.sizeCtl = cap;
}
private static final int tableSizeFor(int c) {
int n = c - 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;
}
HashMap 、ConcurrentHashMap都用到了这个算法
例如传入初始容量为15 , 那么构造方法中会对这个容量进行计算为 可以装得下15的 最小2的n次幂数值