HashMap的底层实现原理

本文介绍了HashMap在Java1.8版本中的改进,从基于数组和链表的结构升级到使用链表或红黑树处理冲突,以提高查询效率并管理内存空间。

一、原理?

在jdk1.7及之前,hashmap是通过数组加链表的形式实现的,而在jdk1.8时hashmap就通过数组加链表或红黑树的方式实现。
键值对添加流程,当需要存储新的键值对(key-value)时,hashmap会根据key的hash值来计算其在数组中的位置,如果有了其他的键值对,则通过链表或红黑树解决冲突,将其添加到链表或红黑树的末尾。
在这里插入图片描述

二、链表升级为红黑树的规则

为了查询速度提升将链表升级
1、链表的长度大于阈值(默认为8)
2、并且此时数组的长度大于64
升级流程:
1.创建一个红黑树,将链表中的值全部添加到红黑树中
2.将原来链表的引用指向新创建的红黑树

二、红黑树退化为链表

当进行了删除操作,为了节省内存空间,将红黑树退化为链表
条件:红黑树的节点小于等于6
退化流程:
1.从红黑树根节点开始中序遍历将所有的节点加入到新的链表中
2.再将原来红黑树的引用指向新创建的链表。

总结

HashMap 在 JDK 1.7 时,是通过数组 + 链表实现的,而在 JDK 1.8 时,HashMap 是通过数组 + 链表或红黑树实现的。在 JDK 1.8 之后,如果链表的数量大于阈值(默认为 8),并且数组长度大于 64 时,为了查询效率会将链表升级为红黑树,但当红黑树的节点小于等于 6 时,为了节省内存空间会将红黑树退化为链表。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值