HashMap与ConcurrentHashMap

HashMap底层是基于“数组+链表”组成,不过在1.7和1.8中具体实现稍有不同

一,HashMap中比较核心的几个成员变量:
在这里插入图片描述
给定的默认容量是16,负载因子是0.75.map在使用过程中不断往里面存放数据,当数据达到了12,就进行扩容一般是乘2变成32.这个过程涉及到rehash,复制数据等操作所以比较消耗性能,因此通常建议提前预估HashMap的大小

通过上图我们发现,真正存放数据的是
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

在这里插入图片描述
了解了基本结构,看一下其中重要的put,get方法

put方法

在这里插入图片描述
在这里插入图片描述

get方法

在这里插入图片描述

1.8优化

1.7有一个明显的不足:当Hash冲突严重时,在桶上生成的链表会变得越来越长,这样在查询的时候效率会越来越低;时间复杂度为o(N)
1.8对大链表做了优化,修改成了红黑树。这样查询效率提高到了o(logn)

但是hasnmap还是有一个严重的问题,比如在并发的场景下容易出现死循环,在扩容的时候会调用resize方法,就是在这里的操作容易在桶上形成环形链表;这样当获取一个不存在的key时,计算出的index正好是环形链表的下标就会出现死循环

ConcurrentHashMap

数据结构:还是数组+链表
在这里插入图片描述
segment是ConcurrentHashMap的一个内部类
在这里插入图片描述
其中HashEntry组成为:
在这里插入图片描述
原理上来说:ConcurrentHashMap采用了分段锁技术,其中Segment继承了ReentrantLock.
在1.7中解决了并发问题,能支持N个Segment这么多次数的并发,但是还是查询遍历链表效率太低
在1.8上的数据结构上做了改动,采用红黑树可以保证查询效率,甚至取消了分段锁ReentrantLock改成了synchronized

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值