在阅读HashMap的原理文章的时候,其中有一个知识点说的是HashMap的数组长度是2的N次方,即使调用含有容量参数的构造方法,内部也会将数组长度调整到2的N次方.这么做最大的原因,是为了减少哈希冲突,尽量散列.我看了几篇文章,没有完全解释清楚为何能减少,所以我多看了几遍源码,加上根据我自己的理解,确定是利用了二进制按位与的特点
假如数组长度是16,put操作的时候都是拿元素的hash key和数组长度-1进行的按位与
所以获取下标的公式是:x&1111,x指hash key
证明如下:(x1,x2的hash key只有4位)
1:有两个不同的x1,x2和1111按位与.
按照按位与的特点,x1,x2其中肯定某一位不同,假设是i位,和1111中的i位按位于,结果必然不同.
2:有两个不同的x1,x2,和小于15的长度按位与.也即****,其中必然有一位是0,假设是在i位
x1,x2恰好在i位不一样,但是和****的i位按位与,结果都是0.也即结果出现了,不同的x1,x2,最后和****按位与的结果一样,发生了hash冲突.
总结:如果不是2的N次方-1,不同的x1,x2,计算得到的下标位置可能一样,但如果是2的N次方-1,不同的x1,x2,结算得到的下表位置必然不一样.hash冲突肯定也是2的N次方来的少