JDK 1.8 HashMap 源码解析,面试底层代码

@#HashMap 源码解析OC

#HashMap 源码解析

详细解析了当前 Java 面试中 HashMap 高频面试题:面试阿里,HashMap 这一篇就够了

几个点:
先了解以下几个点,有利于更好的理解 HashMap 的源码和阅读本文。

1、本文中头节点指的是 table 表上索引位置的节点,也就是链表的头节点。

2、根节点(root 节点)指的是红黑树最上面的那个节点,也就是没有父节点的节点。

3、红黑树的根节点不一定是索引位置的头节点(也就是链表的头节点),HashMap 通过 moveRootToFront 方法来维持红黑树的根结点就是索引位置的头结点,但是在 removeTreeNode 方法中,当 movable 为 false 时,不会调用 moveRootToFront 方法,此时红黑树的根节点不一定是索引位置的头节点,该场景发生在 HashIterator 的 remove 方法中。

4、转为红黑树节点后,链表的结构还存在,通过 next 属性维持,红黑树节点在进行操作时都会维护链表的结构,并不是转为红黑树节点,链表结构就不存在了。

5、在红黑树上,叶子节点也可能有 next 节点,因为红黑树的结构跟链表的结构是互不影响的,不会因为是叶子节点就说该节点已经没有 next 节点。

6、源码中一些变量定义:如果定义了一个节点 p,则 pl(p left)为 p 的左节点,pr(p right)为 p 的右节点,pp(p parent)为 p 的父节点,ph(p hash)为 p 的 hash 值,pk(p key)为 p 的 key 值,kc(key class)为 key 的类等等。源码中很喜欢在 if/for 等语句中进行赋值并判断,请注意。

7、链表中移除一个节点只需如下图操作,其他操作同理。

8、红黑树在维护链表结构时,移除一个节点只需如下图操作(红黑树中增加了一个 prev 属性),其他操作同理。注:此处只是红黑树维护链表结构的操作,红黑树还需要单独进行红黑树的移除或者其他操作。

9、源码中进行红黑树的查找时,会反复用到以下两条规则:1)如果目标节点的 hash 值小于 p 节点的 hash 值,则向 p 节点的左边遍历;否则向 p 节点的右边遍历。2)如果目标节点的 key 值小于 p 节点的 key 值,则向 p 节点的左边遍历;否则向 p 节点的右边遍历。这两条规则是利用了红黑树的特性(左节点 < 根节点 < 右节点)。

10、源码中进行红黑树的查找时,会用 dir(direction)来表示向左还是向右查找,dir 存储的值是目标节点的 hash/key 与 p 节点的 hash/key 的比较结果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值