jdk8 HashMap tableSizeFor
今天读jdk8 HashMap源码,构造函数中 根据initialCapacity初始化threshold
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);//大于initialCapacity的最小的2的幂
}
其中tableSizeFor 函数看的一脸懵,记录一下
/** * Returns a power of two size for the given target capacity. * 取大于capacity的最小的2的幂 */ static final int tableSizeFor(int cap) { int n = cap - 1;//防止cap正好是2的幂的情况下扩大cap,进行cap<<1的情况 n |= n >>> 1;//保证n的高位前2位全是1(如果n的第一个1出现在大于第1位的位置,最低位是第0位) n |= n >>> 2;//保证n的高位前4位全是1(如果n的第一个1出现在大于第3位的位置) n |= n >>> 4;//保证n的高位前8位全是1(如果n的第一个1出现在大于第7位的位置) n |= n >>> 8;//保证n的高位前16位全是1(如果n的第一个1出现在大于第15位的位置) n |= n >>> 16;//保证n的高位前32位全是1(如果n的第一个1出现在大于第31位的位置) /** * 经过或运算后 n是低位全是1的值(如0000 0001 1111 1111),n+1后变成高位进1,低位全是0(0000 0010 0000 0000),正好是2的幂 */ return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }

浙公网安备 33010602011771号