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]

你可能感兴趣的:(源码分析,java,每日总结)