HashMap解决Hash冲突

什么是哈希冲突

当两个个不同的值,根据同一散列函数计算出相同的散列值现象,称为哈希冲突

HashMap的数据结构

HashMap是由数组+链表组成的,jdk1.8后加入了红黑树

​ 使用链地址法来解决哈希冲突,这样我们可以将具有相同哈希值的对象组织成一个链表放在hash值所对应的bucket下,但是相比hashCode返回的int类型,HashMap初始的容量大小为DEFAULT_INITIAL_CAPACITY = 1 << 4(即
2的四次方16)要远小于int类型的范围,所以,如果知识单纯的使用hashCode取余来获取对应的bucket这将会大大增加哈希碰撞的概率,并且最坏情况下还会将HashMap变成一个单链表,所以需要将hashCode做一定的优化hash()函数。

​ 因为如果使用hashCode来取余,那么相当于参与运算的只有hashCode的低位,高位没有起到任何作用,所以我们的思路就是让hashCode取值出的高位也参与运算,进一步降低hash冲突的概率,使得数据分布更平均,我们把这样的操作称为扰动。在JDK1.8中的hash函数如下

static final int hashCode(Object key){int h;//与自己右移16位进行异或运算(高低位异或)return (key==null)? 0 : (h==key.hashCode()) ^ (h>>>16)//
}

​ 这比在JDK 1.7中,更为简洁,相比在1.7中的4次位运算,5次异或运算(9次扰动),在1.8中,只进行
了1次位运算和1次异或运算(2次扰动);

jdk1.8新增红黑树

​ 通过上面的链地址法(使用散列表)和扰(img)动函数我们成功让我们的数据分布更平均,哈希碰撞减
少,但是当我们的HashMap中存在大量数据时,加入我们某个 bucket下对应的链表有n个元素,那么遍
历时间复杂度就为O(n),为了针对这个问题,JDK1.8在HashMap中新增了红黑树的数据结构,进一步使
得遍历复杂度降低至O(logn);

总结

简单总结一下HashMap是使用了哪些方法来有效解决哈希冲突的:

  1. 使用链地址法(使用散列表)来链接拥有相同hash值的数据;
  2. 使用2次扰动函数(hash函数)来降低哈希冲突的概率,使得数据分布更平均;
  3. 引入红黑树进一步降低遍历的时间复杂度,使得遍历更快

HashMap解决哈希冲突相关推荐

  1. HashMap是怎么解决哈希冲突的?

    文章目录 HashMap是怎么解决哈希冲突的? 什么是哈希冲突? HashMap采用链式寻址法解决 扩展 开放寻址法 再Hash法 建立公共溢出区 HashMap是怎么解决哈希冲突的? 一搜博客啊,我 ...

  2. HashMap是怎么解决哈希冲突的

    简单总结一下HashMap是使用了哪些方法来有效解决哈希冲突的: 使用拉链法(使用链表)来链接拥有相同hash值的数据: 使用新hash函数(2次扰动函数)来降低哈希冲突的概率,使得数据分布更平均: ...

  3. HashMap中解决哈希冲突

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.什么是哈希冲突 二.如何解决哈希冲突 一.什么是哈希冲突 当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入 ...

  4. 哈希表(解决哈希冲突)

    哈希表是一种存储记录的连续内存通过哈希函数的应用,通过哈希函数的应用,可以快速存取与查找数据.所谓哈希法(Hashing),就是将本身的键(Key)通过特定的数学函数运算或使用其他的方转化成对应的数据 ...

  5. 【什么是哈希, 什么是哈希冲突,怎么解决哈希冲突? 】

    Hash, 一般翻译为"散列" , 散列值有直接音译为"哈希"的, 这就是把任意长度的输入通过散列 算法, 变换成固定长度的输出, 该输出就是散列值(哈希值) ...

  6. 拉链法解决哈希冲突的方式和几种常见的散列函数

    本文探讨拉链表解决哈希冲突的方式和几种常见的散列函数. 首先,什么是散列表? 对于一个数组,我们在O(1)时间复杂度完成可以完成其索引的查找,现在我们想要存储一个key value的键值对,我们可以根 ...

  7. *8.哈希冲突是什么?以及如何解决哈希冲突

    哈希表:又叫散列表.是根据关键码值而直接进行访问的数据结构哈希表一个映射表,就是通过哈希函数算法,有的一个多对一的映射. 那哈希表有什么用呢? 很明显能加快查找速度.举个例子,你在查字典的时候,如果不 ...

  8. python字典实现原理-哈希函数-解决哈希冲突方法

    python字典实现原理-哈希函数-解决哈希冲突方法 参考文章: (1)python字典实现原理-哈希函数-解决哈希冲突方法 (2)https://www.cnblogs.com/guyannanfe ...

  9. 什么是哈希冲突?怎样解决哈希冲突?

    首先,要明白哈希冲突,我们需要明白什么是哈希表. 一.哈希表 概念: 哈希表(又叫散列表)是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访 ...

最新文章

  1. iOS 疑难杂症— — 收到推送显示后自动消失的问题
  2. 远程桌面的分辨率最大不会超过本机真实物理机的分辨率
  3. 云服务器开启ftp_FTP是什么?FTP和虚拟主机的关系
  4. linux服务器磁盘扩容的方法
  5. cloudwatch监控_Amazon CloudWatch:无服务器日志记录和监控基础
  6. Client.Timeout exceeded while awaiting headers
  7. iOS:苹果内购实践
  8. getprofile()获取不到路径_获取链接文件Document——Dynamo Python系列教程(一)
  9. Adtran加入SDN大潮,剑指运营商SDN转型
  10. 在线GIF图片帧修改工具
  11. linux加速度传感器校准,加速度传感器校准方法及装置与流程
  12. 【Python】SciKit-Learn包安装问题
  13. java 第三方jar推荐_java 开发第三方Jar包
  14. 常用的颜色色值(转)
  15. dataGrid使用deleteRow删除数据时会出现 ‘id‘ of undefined
  16. 是什么限制了你的成功?
  17. 力扣 2104. 子数组范围和
  18. 被修饰成单栋的倾斜摄影处理思路
  19. 基于YOLOv7的芯片表面缺陷检测系统(源码&教程)
  20. 是要成为海贼王的男人——日记4.23

热门文章

  1. [iOS微博项目 - 3.2] - 发送微博
  2. ACME.SH 申请SSL证书(免费、自动更新)
  3. 皕杰报表工具中如何展示图片
  4. NTU商汤提出新 loss!Focal Frequency Loss 提升图像重建和图像合成的质量 ICCV2021
  5. 超越影像——RSNA 2016参展随感 (二)
  6. android 无法绑定 1024 以下端口
  7. python随机生成10个数字进行冒泡排序_Python实现冒泡排序
  8. 2.8.4SQLAlchemy
  9. 51CTO培训心得体会
  10. 美国留学ib课程和ap课程区别