0
点赞
收藏
分享

微信扫一扫

HashMap底层探究(一)

毅会 2022-01-20 阅读 86

1.HashMap 实现原理

HashMap 基于 Hash 算法实现的

  1. 当我们往Hashmap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
  2. 存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中
  3. 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
  4. 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。

Hash函数是什么?为什么要用它

问题: HashMap初始的容量大小DEFAULT_INITIAL_CAPACITY = 1 << 4(即2的四次方16)要远小于int类型的范围,所以我们如果只是单纯的用hashCode取余来获取对应的bucket这将会大大增加哈希碰撞的概率,并且最坏情况下还会将HashMap变成一个单链表

理由: 主要是因为如果使用hashCode取余,那么相当于参与运算的只有hashCode的低位,高位是没有起到任何作用的,所以我们的思路就是让hashCode取值出的高位也参与运算,进一步降低hash碰撞的概率,使得数据分布更平均,我们把这样的操作称为扰动

总结:因为初始化的的map容量小,所以会增加碰撞,所以为了减小碰撞,产生hash函数,对hashcode进行取余操作,减少碰撞

2.HashMap在JDK1.7和JDK1.8中有哪些不同?

在这里插入图片描述
相同:
两者均有数组和链表。数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以我们将数组和链表结合在一起,发挥两者各自的优势,使用一种叫做拉链法的方式可以解决哈希冲突。

升级:
jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。

  • resize 扩容优化
  • 引入了红黑树,目的是避免单条链表过长而影响查询效率,
  • 解决了多线程死循环问题,但仍是非线程安全的,多线程时可能会造成数据丢失问题。
举报

相关推荐

HashMap底层源码

hashMap底层原理

Hashmap底层源码解析

HashMap底层实现原理

重温HashMap底层原理

HashMap底层简单原理

HashMap的底层实现

Mysql底层索引结构探究

0 条评论