HashMap解决哈希冲突
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是使用了哪些方法来有效解决哈希冲突的:
- 使用链地址法(使用散列表)来链接拥有相同hash值的数据;
- 使用2次扰动函数(hash函数)来降低哈希冲突的概率,使得数据分布更平均;
- 引入红黑树进一步降低遍历的时间复杂度,使得遍历更快
HashMap解决哈希冲突相关推荐
- HashMap是怎么解决哈希冲突的?
文章目录 HashMap是怎么解决哈希冲突的? 什么是哈希冲突? HashMap采用链式寻址法解决 扩展 开放寻址法 再Hash法 建立公共溢出区 HashMap是怎么解决哈希冲突的? 一搜博客啊,我 ...
- HashMap是怎么解决哈希冲突的
简单总结一下HashMap是使用了哪些方法来有效解决哈希冲突的: 使用拉链法(使用链表)来链接拥有相同hash值的数据: 使用新hash函数(2次扰动函数)来降低哈希冲突的概率,使得数据分布更平均: ...
- HashMap中解决哈希冲突
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.什么是哈希冲突 二.如何解决哈希冲突 一.什么是哈希冲突 当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入 ...
- 哈希表(解决哈希冲突)
哈希表是一种存储记录的连续内存通过哈希函数的应用,通过哈希函数的应用,可以快速存取与查找数据.所谓哈希法(Hashing),就是将本身的键(Key)通过特定的数学函数运算或使用其他的方转化成对应的数据 ...
- 【什么是哈希, 什么是哈希冲突,怎么解决哈希冲突? 】
Hash, 一般翻译为"散列" , 散列值有直接音译为"哈希"的, 这就是把任意长度的输入通过散列 算法, 变换成固定长度的输出, 该输出就是散列值(哈希值) ...
- 拉链法解决哈希冲突的方式和几种常见的散列函数
本文探讨拉链表解决哈希冲突的方式和几种常见的散列函数. 首先,什么是散列表? 对于一个数组,我们在O(1)时间复杂度完成可以完成其索引的查找,现在我们想要存储一个key value的键值对,我们可以根 ...
- *8.哈希冲突是什么?以及如何解决哈希冲突
哈希表:又叫散列表.是根据关键码值而直接进行访问的数据结构哈希表一个映射表,就是通过哈希函数算法,有的一个多对一的映射. 那哈希表有什么用呢? 很明显能加快查找速度.举个例子,你在查字典的时候,如果不 ...
- python字典实现原理-哈希函数-解决哈希冲突方法
python字典实现原理-哈希函数-解决哈希冲突方法 参考文章: (1)python字典实现原理-哈希函数-解决哈希冲突方法 (2)https://www.cnblogs.com/guyannanfe ...
- 什么是哈希冲突?怎样解决哈希冲突?
首先,要明白哈希冲突,我们需要明白什么是哈希表. 一.哈希表 概念: 哈希表(又叫散列表)是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访 ...
最新文章
- iOS 疑难杂症— — 收到推送显示后自动消失的问题
- 远程桌面的分辨率最大不会超过本机真实物理机的分辨率
- 云服务器开启ftp_FTP是什么?FTP和虚拟主机的关系
- linux服务器磁盘扩容的方法
- cloudwatch监控_Amazon CloudWatch:无服务器日志记录和监控基础
- Client.Timeout exceeded while awaiting headers
- iOS:苹果内购实践
- getprofile()获取不到路径_获取链接文件Document——Dynamo Python系列教程(一)
- Adtran加入SDN大潮,剑指运营商SDN转型
- 在线GIF图片帧修改工具
- linux加速度传感器校准,加速度传感器校准方法及装置与流程
- 【Python】SciKit-Learn包安装问题
- java 第三方jar推荐_java 开发第三方Jar包
- 常用的颜色色值(转)
- dataGrid使用deleteRow删除数据时会出现 ‘id‘ of undefined
- 是什么限制了你的成功?
- 力扣 2104. 子数组范围和
- 被修饰成单栋的倾斜摄影处理思路
- 基于YOLOv7的芯片表面缺陷检测系统(源码&教程)
- 是要成为海贼王的男人——日记4.23