有关于HashMap的底层实现

文章介绍了HashMap在JDK1.8之前的实现是数组加链表,通过哈希值定位存储位置,解决哈希碰撞问题。JDK1.8后,为了优化长链表查询效率,引入了红黑树,降低查询复杂度。虽然红黑树的旋转操作复杂,但能有效提高数据检索速度。
摘要由CSDN通过智能技术生成

今天背八股文的时候浅浅看了一下这个HashMap有关的一些东西

HashMap分为两个阶段

在JDK1.8之前,底层使用数组 +  链表来实现的

在JDK1.8之后,底层使用数组 +  链表 + 红黑树来实现

这里就涉及到三个东西,数组,链表,红黑树

首先先解释一下在JDK1.8之前的实现方式,我们都知道数组他是紧挨在一起的,如下

链表他不仅存储数据,还存储指向下一个数据的指针,就有点像是这样子的

那他们的数据存储呢,是Key-Value这种形式,他通过计算Key的哈希值,然后来定位到他在数组中存储的一个位置

其中还涉及到一个取模的东西,比如 love 这个key计算出来的哈希值是100 但是取模变成10 所以存在数组下标10的位置,大概就是这么一个意思啊

但是这里就会涉及到一个哈希碰撞的问题,就是两个不一样的东西他计算出来的hash值可能是相同的,这就是我们为什么说用hash值来比较两个东西是否相等不靠谱的原因。

这里的解决方式就是如果哈希值相同,就用链表的形式来存储,样子大概如下

然后就是JDK1.8之后的存储方式了,明明以及用链表可以解决,为什么还要引入红黑树?

就有这么一种情况,他数组的长度不长,但是链表的长度很长,这样的话查询起来就贼离谱,因为我们都知道链表的特点就是查询巨慢,他得把整个链表从头到尾过一遍,所以才引入了红黑树

但是这里红黑树我也不太懂,大概就变成了这个样子

这样其实可以很明显得看到了嘛,四个数据,但是只有两层,要是链表的话,就有四层了

有关红黑树的东西有兴趣的可以百度一下,这个玩意我也搞不懂,旋来旋去的,看着就烦 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值