HashMap 和 ConcurrentHashMap 核心原理

HashMap 和 ConcurrentHashMap 原理、源码分析

一、HashMap原理

1.什么是HashMap:

(1)HashMap 是基于Map接口的非同步实现,线程不安全,为了快速存取而设计,相对于 arrayList 查询快增删慢,LinkedList增删快查询慢的一种折中的方案。采用key-value兼职对的形式存放元素,并封装成Node对象 允许使用null为key或value,并且放在Node[0]位置。

(2)JDK1.7 及之前的版本使用数组+链表,JDK1.8之后的版本可以看成“ 数组+链表+红黑树” ,当数组长度大于64,或者链表长度大于8,则链表转换为红黑树 ,小于6转为链表,6-8可以看做缓冲区防止链表红黑树经常转换,损耗性能。转换的目的是当链表中元素较多时,也能保证HashMap的存取效率。

HashMap 在进行插入和删除时有可能会触发红黑树的插入平衡调整(balanceInsertion方法)或删除平衡调整(balanceDeletion )方法,调整的方式主要有以下手段:左旋转(rotateLeft方法)、右旋转(rotateRight方法)、改变节点颜色(x.red = false、x.red = true),进行调整的原因是为了维持红黑树的数据结构。

当链表长过长时会转换成红黑树,那能不能使用AVL树替代呢?AVL树是完全平衡二叉树,要求每个结点的左右子树的高度之差的绝对值最多为1,而红黑树通过适当的放低该条件(红黑树限制从根到叶子的最长的可能路径不多于最短的可能路径的两倍长,结果是这个树大致上是平衡的),以此来减少插入/删除时的平衡调整耗时,从而获取更好的性能,虽然会导致红黑树的查询会比AVL稍慢,但相比插入/删除时获取的时间,这个付出在大多数情况下显然是值得的。

(3)HashMap 有两个影响性能的关键参数:“

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值