聊聊HashMap 的结构

  • HashMap的数据结构

     hashmap 是由数组+链表组合成的数据结构,1.8以后是数组+链表+红黑树,数组的每个地方都存储了key-value这样的对象,在1.7叫Entry 1.8叫Node,HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对和hash值

默认实例化后每个元素里面都是null,在put时候会根据key的hash计算一个index值,如 put(“张飞”,666),这个时候通过hash计算出index的坐标位置:hash(“张飞”) = 1,但是数组的长度是有限的,在有限的长度里面使用hash本身存在概率性问题,也就是容易重复。比如我门哈希的张飞也有可能是这样,hash(“飞张”)=1 也index也等于1,这样坐标为1的数据就会出现一个链表,链表则是主要为了解决哈希冲突而存在的。

                   jdk1.7

         jdk1.8

如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

这就是hash方法

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值