HashMap
map家族

一. HashMap的数据结构:
- jdk1.7结构是:数组+链表
- jdk1.8结构是:数组+链表+红黑树
![image]()
二. HashMap性能参数:
- 初始容量capacity:创建数组的长度默认是16,如果太少,很容易触发扩容,如果太多,遍历数组会比较慢。
- 负载因子loadFactor:一个衡量的尺度,数组长度达到多少的时候触发数组自动扩容,默认是0.75.
- 阈值threshold:阈值=容量负载因子,默认160.75=12,当元素数量超过阈值会触发扩容。
- 当数组长度达到64,且某个链表的长度大于8,会将某个位置的链表转为红黑树.
三. 多线程条件下HashMap的问题:
1、多线程情况下get和put时,有可能get数据会是null,原因:hashmap在动态扩容时,数据位置发生了变化,导致get数据有可能是null
2、多线程条件下会导致死循环问题,导致CPU100%。
3、多线程put可能会丢失数据。
四. HashMap链表节点过深时为什么选择使用红黑树
- 二叉查找树(BST)
![image]()
可视化数据结构的网站:https://www.cs.usfca.edu/~galles/visualization/BST.html
因为二叉查找树在极端情况下可能会变成链表,导致查询效率降低。 - 平衡查找二叉树(AVL)
![image]()
因为平衡查找二叉树会不断地旋转保持自平衡,会降低hashmap的效率。 - 红黑树
![image]()
五. 红黑树与平衡查找二叉树的区别:

六. hash冲突怎么办?
- 开放地址法
简单理解为:冲突之后,在当前位置继续寻找空的位置。
![image]()
- 再hash法
- 链地址法:HashMap采用的这种方法:jdk1.7是头插法,1.8是尾插法
![image]()







浙公网安备 33010602011771号