HashMap实现原理

1.HashMap实现原理

HashMap底层是通过数组加链表的方式实现的,首先假如定义一个数组长度为5,当添加元素时,根据key的hashcode值%5进行取余,如果余值为3,则放在数组的第四个位置,如果第四个位置已经有值,则会发生hash碰撞问题,所以HashMap又采用了链表的方式进行存储,如果key值存在则覆盖,如果不存在,则添加;HashMap取值的时候也是一样,通过key的hashCode值取余算出数组的第几个位置,然后通过equals方法进行一一比对,最终找到对应的value值。在一一对比的时候是消耗效率的,所以存的值越多,效率会越低。

HashMap之所以能一直存数据,是因为map的初始容量是16,也就是2的4次方,加载因子是0.75,当数据总量达到容量的百分之七十五之后,容量会翻倍

 

2.HashMap死锁原因及解决方案

HashMap是非线程安全的,死锁一般都是产生于并发情况下。我们假设有两个进程t1和t2,hashMap的容量为2(当然HashMap的容量肯定不可能是2,这里只是假设),t1线程放入key A.B.C.D.E。在t1线程中A、B、C的hash取余值相同,于是就形成了一个链表,假设A->C->B,

而D、E的hash取余值不同,于是hashMap的容量不足,需要新建一个更大的容量,然后把数据从老的Hash表中迁移到新的Hash表中(通过refresh方法)。这时t2进程闯进来了,t1暂时挂起,t2进程也准备放入新的key,这时也发现容量不足,也refresh一把,refresh之后的链表结构发生变化,假设变成C->A,之后t1进程继续执行,链接结构为A->C,这时候就形成A.next=C,C.next=A的环形链表。一旦取值进入这个环形链表之后就会陷入死循环

解决方案:

使用ConcurrentHahsMap进行替代,ConcurrentHashMap是线程安全的。可能有人会使用HashTable,HashTable也是线程安全的,但HashTable锁定的是整个Hash表,效率相对比较低。而ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持尽量的小

3.LinkedHashMap的应用

LinkedHashMap是HashMap的一个子类,保存了记录顺序。如果需要按顺序访问的话可以使用linkedHahsMap。其中一些缓存(比如ehcache二级缓存)的淘汰策略(LRU)就是在LinkedHashMap上扩展的

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值