我来谈谈为何hashmap每次扩容试都要扩两倍,resize()时为何每次要扩两倍?
计算桶位置,i = (n - 1) & hash,n 为2的幂时,(n-1) & hash = hash % n, 相当于对length求模,位运算效率更高。
rehash时需要重新计算桶位置,如果不是2的幂,n -1转为二进制后,最低位始终是0,导致最低位为0的桶被浪费,造成更多的hash碰撞。
如果length不为2的幂,比如15。那么length-1的2进制就会变成1110。在h为随机数的情况下,和1110做&操作。尾数永远为0。那么0001、1001、1101等尾数为1的位置就永远不可能被entry占用。这样会造成浪费,不随机等问题。 length-1 二进制中为1的位数越多,那么分布就平均。
所以HashMap的初始容量是2的n次幂,扩容也是2倍的形式,元素均匀分布在HashMap中的数组上,减少hash碰撞,避免形成链表的结构,使得查询效率降低!
展开