1:为什么HashMap的容量必须是2的幂次方
DEFAULT_INITIAL_CAPACITY为素组bucket的长度,假如为16,现在有两个值计算出hash值,分别为17, 和34,如何放入bucket里面:我们的原则是尽量是放入的值不在同一个key上面,这样链表的长度就不会很长,方便查找。
首先想到的是算出的hash值和数组bucket的长度16进行取余计算, 17%16=1, 34%16=2,这样,这两个数值放在index为1以及index为2的地方,这样没问题。但是有一种更高效的方法,
17转为2进制为:10001, 34转为2进制为:100010,将他们与01111进行&预算:
010001 100010
&001111 001111
结果: 000001 000010
结果得到:17为1, 34为2,与%相同,但是&会比%高效很多。所以选择用&来对hash值进行计算。
再来看看01111是哪里来的,01111 = 10000-1, 而10000= 2的4次方,即上诉bucket的长度16.所有2的幂次方-1,最后几位都是1111,这样能最大程度保证hash &计算结果的分布均匀。
综上所述:HashMap的容量必须是2的幂次方,是因为参与hash &计算的值需要为:2的幂次方-1.
原文:https://www.cnblogs.com/wnpp/p/14612279.html