HashMap中容量爲什麼用2的冪次方,不用素數

  1. 衆所周知,很多結構如Hashtable初始容量都用是11,用的素數,爲了後期存數據的時候能後分布更均勻
    如果用合數,重新rehash後,之前在一組的數又會重新在一起,所以不分散,所以不採用
  2. HashMap爲什麼要求容量是2的冪次方呢?
    對,就用是之前在一組的數字,rehash之後會重新在一起。

定義數字爲n,容量爲cap,cap爲2的冪次方
則一般取模運算爲: n&(cap-1)

舉例:
cap=16, n1 = 26

  0000 0000 0001 1010
| 0000 0000 0000 1111
-------------------------------
  0000 0000 0000 1010

n2 = 10

  0000 0000 0000 1010
| 0000 0000 0000 1111
-------------------------------
  0000 0000 0000 1010

n1、n2放在同一個table[10]中

如果cap擴容倍,則cap=32
n1=26

  0000 0000 0001 1010
| 0000 0000 0001 1111
-------------------------------
  0000 0000 0001 1010

n2=10

  0000 0000 0000 1010
| 0000 0000 0001 1111
-------------------------------
  0000 0000 0000 1010

則n1放在table[26],n2放在table[10]中

綜上所述

  • 在同一桶中的值table[i],在擴容一倍後會放到table[i+oldCap]中
  • 求新數字放到table[i]和table[i+oldCap]中的方法爲:判斷n中針對oldCap的1所在的最高位是0還是1
    • 如果n&oldCap爲1,則放到table[i+oldCap]
    • 如果n&oldCap爲0,則放到table[i]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章