JDK1.8 之前 HashMap
底层是 数组和链表 结合在一起使用也就是 链表散列。通过拉链法解决冲突。
所谓 “拉链法” 就是:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
JDK1.8 之后,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)。
扩容后原有数据重新分布,按原始容量两倍扩容(默认初始16),其容量全程都是2的n次、
其他扩容条件:数组元素数量满数组容量的75%,进行两倍扩容(64之前也会)
参考: