ConcurrentHashMap,hashMap,TreeMap全总结(不看后悔哦)

本文详细介绍了HashMap在JDK7和8的区别,包括红黑树的引入、扩容策略和链表处理方式的改变。同时,对比了ConcurrentHashMap与HashMap、HashTable的异同,分析了线程安全和效率问题。还探讨了JDK8中ConcurrentHashMap的扩容机制以及TreeMap与HashMap的实现原理和应用场景。
摘要由CSDN通过智能技术生成

JDK8中的HashMap与JDK7的HashMap有什么不一样?

  1. JDK8中新增了红黑树,JDK8是通过数组+链表+红黑树来实现的
  2. JDK7中链表的插入是用的头插法,而JDK8中则改为了尾插法
  3. JDK8中的因为使用了红黑树保证了插入和查询了效率,所以实际上JDK8中的Hash算法实现的复杂度降低了
  4. JDK8中数组扩容的条件也发了变化,只会判断是否当前元素个数是否超过了阈值,而不再判断当前put进来的元素对应的数组下标位置是否有值。
  5. JDK7中是先扩容再添加新元素,JDK8中是先添加新元素然后再扩容
    HashMap中PUT方法的流程?
  6. 通过key计算出一个hashcode
  7. 通过hashcode与“与操作”计算出一个数组下标
  8. 在把put进来的key,value封装为一个entry对象
  9. 判断数组下标对应的位置,是不是空,如果是空则把entry直接存在该数组位置
  10. 如果该下标对应的位置不为空,则需要把entry插入到链表中
  11. 并且还需要判断该链表中是否存在相同的key,如果存在,则更新value
  12. 如果是JDK7,则使用头插法
  13. 如果是JDK8,则会遍历链表,并且在遍历链表的过程中,统计当前链表的元素个数,如果超过8个,则先把链表转变为红黑树,并且把元素插入到红黑树中

JDK8中链表转变为红黑树的条件?
14. 链表中的元素的个数为8个或超过8个
15. 同时,还要满足当前数组的长度大于或等于64才会把链表转变为红黑树。为什么?因为链表转变为红黑树的目的是为了解决链表过长,导致查询和插入效率慢的问题,而如果要解决这个问题,也可以通过数组扩容,把链表缩短也可以解决这个问题。所以在数组长度还不太长的情况,可以先通过数组扩容来解决链表过长的问题。

HashMap扩容流程是怎样的?

  1. HashMap的扩容指的就是数组的扩容, 因为数组占用的是连续内存空间,所以数组的扩容其实只能新开一个新的数组,然后把老数组上的元素转移到新数组上来,这样才是数组的扩容
  2. 在HashMap中也是一样,先新建一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值