Java基础——HashMap扩容2倍

HashMap扩容2倍

在HashMap中,执行put方法时,会对添加的key进行运算得出对应的hash值,再根据hash值计算得出对应的hash桶坐标节点tab[i]。

if ((p = tab[i = (n - 1) & hash]) == null)
  tab[i] = newNode(hash, key, value, null);

其中i = (n-1) & hash,n为tab数组长度,默认初始值为16。

扩容倍数为2,则tab长度一定为偶数,所以n-1位奇数,奇数的二进制形式最后一位一定是1,那么与hash进行与运算时得到的可能为奇数也可能为偶数,散列较为均匀。

如果扩容倍数不为2,可能会出现tab长度为奇数的情况,当tab长度为奇数时,n-1一定为偶数,奇数的二进制形式最后一位一定是0,那么与hash进行与运算时得到的一定是偶数,会有一半的hash桶没有得到利用。

举例:tab长度为25,扩容2倍后为50,50的二进制:110010, n-1=110010-1=110001

110001 & hash(111100) = 110000(十进制为48,偶数)散列后为偶数

110001 & hash(100101) = 100001(十进制为33,奇数)散列后为奇数

结果的奇偶由hash值来决定。

tab长度为25,扩容2倍+1后为51,二进制:110011,n-1=110011-1=110010

110010 & hash(111100) = 110000(十进制为48,偶数)散列后为偶数

110010 & hash(100101) =100000(十进制为32,偶数)散列后为偶数

结果一定是偶数,与hash无关,则i为奇数的hash桶无法被利用到。

经验分享 程序员 微信小程序 职场和发展