HashMap jdk7/jdk8 区别

说实话,这个以前专门查过,不过过了一段时间又忘了。。。前几天在刚好看到有人问HashMap的问题,感觉可以答,但只记得8有个红黑树,唉,好记性不如烂笔头,写个blog记录下,虽然这个问题很无聊 o(╯□╰)o

  1. 首先说一下jdk7中HashMap 存储的方式: 数组加链表 数组用来存放key的哈希值,链表用来存放Entry 值。当key的hashCode 冲突且新 key不存在时,使用”头插法”将这个新Entry放到链表的头部,将其next 指向先前的Entry。
    大概就像这样:
    随手画画
    所以说,在最差的情况下,即所有key的hashCode都一样,那么hashmap 就会退化成一个链表,查找的时间复杂度为O(n);当然理想情况下查找的时间复杂度是O(1);

  2. 在jdk8中,在到达某个阈值时,会使用红黑树来提高效率。红黑树的查找、插入、删除的时间复杂度是O(logN)。

    那么可以这样说,jdk7是 数组+链表,jdk8是数组+链表/红黑树 。

    在源码中可以看到,当链表长度长度大于等于7时,会执行链表转换红黑树操作
    这里写图片描述

    所以结构就变成了这个样子:
    这里写图片描述


红黑树的知识点,后面再写blog,不然又会忘掉 。orz

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值