HashMap

转载自漫画算法

转载自微信公众号“算法爱好者”


摘要

1.put方法的原理
2.get方法的原理
3.HashMap的长度

正文:

HashMap是一个用于存储key-value键值对的集合, 每一个键值对也叫作Entry。这些键值对分散存储在一个数组中,这个数组就是HashMap的主干。

1.put方法的原理

比如调用 hashMap.put("apple", 1);插入一个key为“apple”的元素,这时候, 需要一个hash函数来确定Entry的位置。
index = Hash("apple");
假定,最后计算出的index是2,那么结果如下:


但是,因为HashMap的长度是有限的,当插入的Entry越来越多时,再完美的Hash函数也会出现index冲突的情况,比如:

这时候利用链表来解决。
HashMap的每个元素不只是Entry对象,也是一个链表的头结点。每个Entry对象通过Next指针指向它的下一个Entry节点。当新来的Entry映射到冲突的数组位置时只需插入到对应的链表即可。

需要注意的是,新来的Entry节点插入链表时,使用的是头插法。是因为HashMap的发明者认为,后插入的Entry被查找的可能性更大。

2.get方法的原理

比如调用hashMap.get("apple");
首先会把输入的key做一次Hash映射,得到对应的index。
由于刚才所说的Hash冲突,同一个位置有可能匹配到多个entry,这时候就要顺着对应链表的头节点,一个一个向下来查找。
假设我们查找的key是apple:

3.HashMap的长度

默认长度是16,并且每次自动扩展或者手动初始化时,长度都是2的幂。
选择2的次幂是服务于从key映射到index的Hash算法(key的hashcode和(length-1) 进行位运算,也就是从hashcode的后几位定位entry的index)



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值