HashMap是如何解决哈希冲突的?

1.要了解Hash冲突,首先要先了解Hash算法和Hash表

(1)Hash 算法,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出结果是散列值.
(2) Hash 表又叫做"散列表",它是通过 key 直接访问在内存存储位置的数据结构,在具体实现 上,我们通过 hash 函数把 key 映射到表中的某个位置,来获取这个位置的数据,从而加快查 找速度。
(3) 所谓 hash 冲突,是由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,所以总 会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。
2.解决Hash冲突的方法
(1) 开放定址法,也称为线性探测法,就是从发生冲突的那个位置开始,按照一定的次序从 hash 表中找到一个空闲的位置,然后把发生冲突的元素存入到这个空闲位置中。 ThreadLocal 就用到了线性探测法来解决 hash 冲突的。
(2) 链式寻址法,这是一种非常常见的方法,简单理解就是把存在 hash 冲突的 key,以单向 链表的方式来存储,比如 HashMap 就是采用链式寻址法来实现的。
(3) 再 hash 法,就是当通过某个 hash 函数计算的 key 存在冲突时,再用另外一个 hash 函 数对这个 key 做 hash,一直运算直到不再产生冲突。这种方式会增加计算时间,性能影 响较大。
(4) 建立公共溢出区, 就是把 hash 表分为基本表和溢出表两个部分,凡是存在冲突的元素, 一律放入溢出表中.
3.HashMap 在 JDK1.8 版本中,通过链式寻址法+红黑树的方式来解决 hash 冲突问题,其中红黑树是为了优化 Hash 表链表过长导致时间复杂度增加的问题。当链表长度大于 8 并且 hash表的容量大于 64 的时候,再向链表中添加元素就会触发转化。

相关推荐
那雨倾城3 分钟前
用 YOLO Pose + Segmentation 在PiscCode构建“语义佛光”:一次实时视觉语义融合实验
图像处理·python·opencv·算法·yolo·计算机视觉·视觉检测
nnerddboy4 分钟前
解决传统特征波段选择的局限性:1.对偶学习
学习·算法·机器学习
CoovallyAIHub12 分钟前
自顶向下 or 自底向上?姿态估计技术是如何进化的?
深度学习·算法·计算机视觉
q_302381955622 分钟前
14.7MB轻量模型!NVIDIA Jetson边缘设备解锁工厂设备故障预警新方案
人工智能·python·算法·ascend·算子开发
爱敲点代码的小哥30 分钟前
C#哈希表遍历技巧全解析以及栈 堆 队列的认识
算法·哈希算法
xiaoxue..32 分钟前
爬楼梯问题:从递归到动态规划再到闭包的进化之路
javascript·算法·面试·动态规划
CoovallyAIHub35 分钟前
YOLO11算法深度解析:四大工业场景实战,开源数据集助力AI质检落地
深度学习·算法·计算机视觉
小徐Chao努力36 分钟前
Go语言核心知识点底层原理教程【Map的底层原理】
java·golang·哈希算法
import_random40 分钟前
[推荐]embedding嵌入表示是如何生成的(实战)
算法
chao18984442 分钟前
基于布谷鸟搜索算法的分布式电源多目标选址定容
算法