HashMap 扩容机制
默认初始化
当HashMap 未初始化容量时,第一次put()添加元素,table数组未null,触发扩容机制,resize()会初始化table数组,默认值为16,阈值threshold为12(16容量capacity*0.75负载因子loadfactor),直到size>threshold时再次进行扩容,采用左移1位运算,将容量扩充为原来的两倍,阈值也是;如此反复。
指定初始化
当实例化HashMap时,指定参数时,若传参不是2的幂次时,构造函数会自动将该值转为大于次数最近的2次幂(如100->128、129->256等),当添加元素个数大于阈值时,触发扩容机制,将容量和阈值扩充为原来的两倍。
扩容触发条件
1>table数组为空或table.size()为零时,采用默认初始化(capacity = 16、threshold=12)
2>size>threshold时,进行扩容为原来的两倍
重新散列
当扩容为原来的两倍时元素重新散列的三种情况
1>为空时,则不赋值(数组默认为null)
2>只有一个元素,直接将元素赋值到新数组
2>红黑树时,将对树进行切分(未详细探究源码)。
3>链表时,用原来的hash数,与oldCap进行&运算(hash&oldCap)意思是假如原来的容量是十六,二进制码为00010000将判断元素哈希值的第五位是否为1若为1,存到新扩展的十六位,否则,存到旧十六位的位置。直到元素的下一个指针为null时停止。哈希值第五个比特为1的链表存到当前下标加oldCap的数组位置;第五比特为零的存到新数组与老数组相同下标下。