hashmap源码分析(基于jdk1.8)

概述:
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.链表中移除一个节点如下图操作,其他操作同理.
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值