HashMap源码学习

JDK1.8下HashMap的源码学习,这里主要针对put方法与get方法

JDK1.8中HashMap的一些秘密

JDK1.8下面HashMap是经常用到的一个容器,比如经典的get,put等方法,但是HashMap的底层是怎么运行的其实不太懂,只停留在用的层面,这里虽然说要写一些HashMap的秘密,但是也是皮毛而已。

JDK1.8版的HashMap

HashMap是一个数组加链表的结构,在JDK1.8里面,HashMap做了一些该井,这里主要针对get方法与put方法做一些简单介绍。JDK1.8里面把HashMap的桶加入了红黑树的数据结构,因为在1.7版本的HashMap里面,当hash冲突严重时,导致桶上的链表越来越长,效率会降低。为了解决这个问题,在1.8里面引入一个阈值,当超过这个阈值(默认为8)会将链表转为红黑树。在HashMap里面有HashEntry这个内部类,它主要保存key,value,,1.7里面HashEntry是一个链表结构,1.8里面达到阈值会转为红黑树。

  1. JDK1.8版本的HashMap中的get方法
    get方法主要是找到那个node,然后getValue,如果没有找到,就返回null,找到了就返回node.value。
    第一步:如果数组为null,直接返回null,不为空则检查第一个node是否是找的值,是则返回,不是则判断下一个节点不为空,再判断是否是treeNode,是treeNode就去treeNode查找,不是则遍历链表,找出满足条件的key和value。
  2. JDK1.8版本的HashMap中的put方法
    第一步:首先判Table是否为空,或者length为0,table为空或者length为0就直接扩容。
    第二步:拿到key之后,对key进行计算hashcode,判断table[i]是否为空,为空,表示这个key不属于某一个桶,直接进行newNode加入到table中。最后如果整个hash的size大于阈值,就执行扩容函数进行扩容。
    第三步:table[i]不为空,判断key是否存在,存在并且是当前key,就直接覆盖。key不存在,就判断这个table[i]是不是treeNode,是treeNode,就直接插入,不是就遍历链表,key存在就覆盖,不存在就插入结点,链表长度大于8就转为红黑树。

JDK1.7里面的HashMap

1.HashMap的get方法
如果HashMap的size是0,get方法就直接返回null。然后根据传入的key,计算出hashcode(如果key为null就直接将hashcode置为0),定位到桶,然后遍历桶这个链表结构,找到hashcode和key相等的node就直接返回这个节点,没有就返回null。

2.HashMap的put方法
根据当前key计算出key的hashcode,然后根据hashcode定位到所在桶,然后,如果桶是一个链表,就直接遍历链表,找到key相等且hashcode相等的就直接覆盖,如果没有定位到桶就直接new一个HashEntry的node插入进去。判断桶是否为空,就是直接判断table[i]是否为null。

由HashMap可以引出ConcurrentHashMap,这个类也有JDK1.7和JDK1.8的区别。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值