一、Java1.8之前
HashMap的底层是数组加链表。调用hashCode方法生成哈希码,再通过哈希算法生成数组索引将对象存入数组中,如果出现索引碰撞就使用链表进行排序,后入的元素加在开头。HashMap的数值会在容量达到75%的时候进行扩容,会将所有元素重新计算索引。
二、Java1.8之后
HashMap的底层是数组加链表加红黑树。前面的算法一样,但是链表后入元素的加在末尾,且在单个链表长度大于8并且总容量大于64个元素时,会将链表转换成红黑树,否则调用resize方法。(因为源码中定义MIN_TREEIFY_CAPACITY = 64 -> 最小树化容量 = 64)