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桶无法被利用到。