jdk8 HashMap tableSizeFor,
分享于 点击 24225 次 点评:251
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; }
相关文章
- 暂无相关文章
用户点评