admin管理员组

文章数量:1611573

HashMap 初始化容量

// 默认容量 16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;  //16

为什么必须是2的n次幂

 因为只有是2n,才可以通过 hash & (leng-1) 计算出的索引尽可能保证数据分布均匀.
 如果不是2的n次幂,计算出的索引特别容易相同,很容易发生hash碰撞,导致其余数组空间很大程度上没有存储数据,链表或者红黑树过长,效率较低.

 说明:为什么是2的n次方?

2n的二进制是一个首位是1 后面为是0的数,如 23 二进制为00001000 23-1 二进制为00000111
hash & (2n-1) 表示 hash值对应的二进制与n个1 做与运算 都为1 则为1 否则为0
只有当 一个数的二进制有效位全是1的情况下 ,不同hash值计算的结果差异性才会更多。
如: 以下结果很明显全为1的情况计算的差异性会更大
  1111111     100000
&001001    &001001
———————————————
  001001    000000

如果在实例化的时候传入的值不是2n会怎样?

当实例化HashMap实例时,如果给定number不是2n initialCapacity(number),由于HashMap的capacity必须是2的次幂,会通过以下方法 (tableSizeFor ) 计算找到大于等于number最小的2n的数。

计算容量分析
HashMap map = new HashMap<>(10)
//获取大于等于传入容量的最小二次幂值 
static final

本文标签: 次方变量源码成员为什么是