1. 程式人生 > 實用技巧 >HashMap原始碼(陣列演算法)

HashMap原始碼(陣列演算法)

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次冪的好處是。。。。待續