HashMap底层相关
- 首先如果对HashMap不进行初始容量设置的话,HashMap的默认初始容量为16
2的幂次方
。如果设置初始容量的话,需要考虑几种情况。HashMap中有默认的最大容量为1 << 30。- 初始容量大于最大容量:则初始容量会被赋值为最大容量
- 初始值小于最大容量:如果该初始容量为
2的幂次方
不会做出改变。而如果不是则要初始容量要为大于该初始容量的最小2的幂次方数
。 - 容量为2的幂次方的原因:哈希值是很大的。而HashMap的底层为数组+链表的形式。如果每个哈希值对应一个数组那是不可能的也会造成内存的极大浪费。因此我们需要对哈希值%数组长度确定数组位置。为了提升这一步的性能,这里运用要求数组长度必须是2的幂次方。
这是因为对2的幂次方取余其实就是相当于(哈希值&(2的n次方 - 1)).
这一步正是其根本原因。
- HashMap底层是基于拉链法。当对应的链表长度超过8时。这时首先会检查数组的长度,如果数组的长度超过64.就会将对应的链表转换为红黑树的数据结构。否则则会对数组进行扩容
- 扩容机制: HashMap中有个负载因子loadFactor,默认值为0.75.当底层数组中元素大于等于
容量大小*负载因子
时,HashMap就会自动扩容。其中扩容大小为原来的两倍。