JDK1.8对HashMap进行了很多优化。
例如当一个槽位slot上的链表个数过多时,则会将链表转换为红黑树,以提高查询检索的效率。
访问节点方式:先找到节点所在的数组index索引位置,然后判断节点是什么结构进行遍历。
- 节点结构是非树型(链表)结构,通过节点的next遍历链表。
- 节点结构是树型(红黑树)结构,HashMap维护了2种节点之间的联系关系,分别是
- 链表方式:通过节点的next遍历链表。
- 红黑树方式:通过根节点root遍历红黑树。
一 链表->红黑树
树化阈值为8
static final int TREEIFY_THRESHOLD = 8;
最小树化容量值为64
static final int MIN_TREEIFY_CAPACITY = 64;
链表转化为红黑树需要满足2个条件
- 链表的节点数量(包括新增节点)大于等于树化阈值(查看源码可知,putVal方法是大于树化阈值,而其他方法是大于等于树化阈值)。
- HashMap的容量(Node数组的长度)大于等于最小树化容量值。
1.1 树化第一个条件
第一个条件:链表的节点数量(包括新增节点)大于等于树化阈值。
HashMap触发判断第一个条件的位置主要有4个方法,分别是putVal方法、computeIfAbsent方法、compute方法、merge方法。
1.1.1 putVal方法
查看putVal

本文解析了JDK1.8中HashMap如何在链表节点过多时转换为红黑树以优化查询,涉及putVal、computeIfAbsent、compute和merge方法的触发条件,以及红黑树转链表的判断标准。重点讲解了树化和非树化的阈值及转换过程。
最低0.47元/天 解锁文章
2224

被折叠的 条评论
为什么被折叠?



