源码hashmap.java文件中有个函数叫tableSizeFor()
,他的作用是,通过-1>>>n-1
返回一个大于n的最小二次幂,n为map之前的容量,而函数返回值就是扩容的二次幂,但是这个不能完美的解释为什么是2次方,然后我从get()
找到了getNode()
函数,他的参数是被处理过得哈希值,通过hash()
返回的哈希值,然后在getNode
中有一条语句是(n-1)&hash
,确定每个元素的底层数组位置,如果n不是2的次方的话,那么n-1中必然不全为1,则与不同的hash相与得到相同的值的几率很大,因为0不论与1和0相与都是0。
所以我觉得之所以是2的次方,一方面是hashmap从一开始就约定好的逻辑结构,另一方面是为了处理hashmap的散列,虽然引入了红黑树,但是还是要尽可能的避免冲突发生。