今天讀jdk8 HashMap源碼,構造函數中 根據initialCapacity初始化threshold public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new Illeg ...
今天讀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; }