hashmap为什么初始容量是2的指数幂

1.hashmap在确定元素落在数组的位置的时候,计算方法是(n - 1) & hash,n为数组长度也就是初始容量 ,这是因为“取模”运算的消耗还是比较大的,那么如何保证(n - 1) & hash和hash%n的结果相同呢,当n为2的指数次幂时,会满足一个公式:(n - 1) & hash = hash % n,这样就可以用(n - 1) & hash的位运算来使计算更加高效。
 
2.如果初始容量是奇数,那么(n-1)就为偶数,偶数2进制的结尾都是0,经过hash值&运算后末尾都是0,那么0001,0011,0101,1001,1011,0111,1101这几个位置永远都不能存放元素了,空间浪费相当大,更糟的是这种情况中,数组可以使用的位置比数组长度小了很多,这样就会造成空间的浪费而且会增加hash冲突。
 
3. 只有是2的指数次幂的数字经过n-1之后,二进制肯定是  ...11111111  这样的格式,这种格式计算的位置的时候,完全是由产生的hash值类决定,而不受n-1 影响。这样会提高效率。比如要扩容了,2的幂次方*2,在二进制中比如4和8,代表2的2次方和3次方,他们的2进制结构相 似,比如 4和8   00000100    0000 1000   只是高位向前移了一位,这样扩容的时候,只需要判断高位hash,移动到之前位置的倍数就可以了,免去了重新计算位置的运算。并且这样可以保证(n - 1) & hash得到的存储位置是在hashmap的length之内的,也就是n之内。因为最大也就是hash值也全是...1111111

posted @ 2020-04-14 10:31  北城cheng  阅读(802)  评论(0编辑  收藏  举报