为什么hashmap的容量永远要是2的次方

源码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的散列,虽然引入了红黑树,但是还是要尽可能的避免冲突发生。

猜你喜欢

转载自www.cnblogs.com/Jun10ng/p/12361286.html