JDK1.8之前采用头插法,采用的是数组+链表,在多线程的环境下可能造成死循环,当 HashMap 进行扩容时,会将原来的 Entry 数组长度扩大为原来的两倍,并重新计算每个元素在新数组中的位置。然后将元素重新插入到新的数组中,这个过程比较耗时。
JDK1.8采用的是尾插法,采用的是数组+链表|红黑树,扩容情况:当数组长度*0.75负载因子,达到预定值扩容2倍,当数组长度大于等于64,并且链表长度大于8,就会将链表转化为红黑树,链表长度小于等于6退化为链表
HashMap是懒惰创建数组的,首次使用创建数组,初始值为0,put数据默认初始容量为16