HashMap原始碼(陣列演算法)
阿新 • • 發佈:2020-08-02
Jdk1.8初始化hashMap容量的演算法
static final int tableSizeFor(int cap) {
// 先減1,避免傳進來的本來就是2的n次冪,導致算出來多了一次冪,比如傳16會得到32,實際上16即可
int n = cap - 1;
// 低位全部變1, int4位元組*1個位元組8位=32位
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
//再加1獲取2的N次冪作為容量return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
舉例,Map map = new hashMap(10)
10-1=9
對應二進位制 0000 1001
右移1位 0000 0100
或運算 0000 1101
結果右移2位 0000 0011
或運算 0000 1111
結果右移4位 00000000 00001111
或運算 00000000 11111111
```
不斷右移然後或運算後,最後低位全部變1
加1後 得到 0001 0000 得到16為最接近10的二的次方數
hashmap陣列容量2的N次冪的好處是。。。。待續