学习自http://nanguocoffee.iteye.com/blog/907824
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
i = (n - 1) & hash
hash方法可以计算一个对象的hashcode,我们不用过于关注
但是他计算hashcode在bucket数组中的位置是怎么计算的呢?
i = (n - 1) & hash
后面就是大家熟悉的碰撞冲突拉链法解决
这里i = (n - 1) & hash就可以实现一个均匀分布
我们比如容量是n=32,那么32-1=31,31的二进制是11111
用我们取得的对象的hashcode和31去进行与操作
我们假设hashcode从1,2,3开始,分别得出的结果是
00001 1
00010 2
....
11111 31
发现是呈一个均匀分布的
如果n=50呢,49的二进制是110001,再作同等假设,得出的值是
000000 : 0
000001 : 1
010000 : 16
010001 : 17
100000 : 32
100001 : 33
110000 : 48
110001 : 49
这就是本质原因,你不用2的幂,保证不了均匀的分布
我们正常的思维是进行一个%运算,但是%运算效率太过低下,所以采用2进制运算,同时为了保证2进制的情况下进行一个均匀分布,所以把容量设置成2的幂,这就是最正确的回答