HashMap中有很多常量数字,如默认初始大小(DEFAULT_INITIAL_CAPACITY)=
,最大容量(MAXIMUM_CAPACITY)=
,默认加载因子(DEFAULT_LOAD_FACTOR)=
,链表转换红黑树的阀值(TREEIFY_THRESHOLD)=
,这些常量是根据什么定义的呢?
默认初始大小(16)
这个初始的大小是1 << 4,也就是,首先这个初始大小是2的倍数,因为当length是2的倍数的时候index = h % length
可以优化成 h & (length-1)
,&
效率高于%
,其次是2的倍数为什么不是4,8,32而是16呢,如果太小的话扩容频繁,太大的话占用内存空间
最大容量
Map中bucket的长度限制是,这里不是说只能放个key-value键值对,因为HashMap是数组加链表结构,这个的bucket是数组的长度,理论上Map的数据量取决于机器内存的大小
默认加载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;
这个默认加载因子的取值是空间跟时间的折中,源码中有注释:
As a general rule, the default load factor (.75) offers a good tradeoff between time and space costs.
当加载因子是0.75的时候,初始大小16的情况下,存放16*0.75=12个元素的时候需要扩容成32,如果这个加载因子太小则会频繁扩容,反之太大的话需要全部放满才扩容容易产生hash碰撞
链表转换红黑树的阀值
这个值8的话跟加载因子一样,也是一个概率问题