概述:
jdk1.8 对于hashmap进行比较大的优化,底层实现由之前的"数组加链表"改为"数组+链表+红黑树",就hashmap的几个常量用的重要方法和jdk1.8之前的死循环问题展开讨论.jdk1.8的hashmap的数据结构如下,当链表节点较少时仍然是以链表存在,当链表节点较多时(大于8)会转为红黑树.
几个点:
先了解一以下几个点,有利于更好的理解hashmap
1.头节点指的是table表上索引位置的节点,也就是链表的头节点.
2.根节点(root节点)指的是红黑树最上面的那个节点,也就是没有父节点的节点.
3.红黑树的根节点一定是索引位置的头节点(也就是链表的头节点)通过moveroottofront方法来维持.
4.转为红黑树节点后,链表的结构还存在,通过next属性维持,红黑树节点在进行操作时都会维护链表结构,并不是转为红黑树节点,链表结构就不存在了.
5.在红黑树上,叶子节点也可能有next节点,因为红黑树的结构根链表的结构是互不影响的,不会因为是叶子节点就说该节点已经没有next节点.
6.源码中一些变量定义:如果定义了一个节点p,则pl为p的左节点,pr为p的右节点.pp为p的父节点,ph为p的hash值,pk为p的key值,kc为key的类等等.源码中很喜欢在if/for等语句中进行赋值并判断.
7.链表中移除一个节点如下图操作,其他操作同理.
hashmap源码分析(基于jdk1.8)
最新推荐文章于 2022-03-31 09:31:50 发布