参考视频:剖析HashMap源码
1、 图解数据结构【有图有真相】
HaspMap数据结构是:数组 + 链表
在jdk1.8之后为了解决HashMap链表过程,导致遍历产生的时间过长,引入了红黑树进行了进一步优化。
总结:
- hashmap的数据结构包括了初始数组、链表、红黑树;
- 插入数据的时候使用pos = key % size 来进行插入数据;
- 当两个或者两个以上的key的相同就会发生冲突,就会挂在数组初始位置的链表后;
- 当某个节点后出现过多的链表节点的时候,就会转换成红黑树以提高效率。
- 数组容量2的倍数:
1)提高运算速度;
2)增加散列度,降低冲突;
3)减少内存碎片。 - hash函数与pos定位:hashcode的高16位与低16位进行异或求模,增加了散列度,降低了冲突。
- 插入冲突:通过单链表解决冲突,如果链表长度超过(TREEIFY_THRESHOLD = 8),进行单链表和红黑树的转换以提高查询速度。
- 扩容:
1)扩容的条件:实际节点数大于等于容量的四分之三;
2)扩容后数据排布:要么是原下标的位置,要么是原下标 + 原容量的位置 - 序列化:只存储了数组的容量、实际节点数量和各个节点的key、value值。