哈希冲突解决方法
哈希冲突:不同 key 算出相同哈希值,映射到同一个数组下标
主要两大类:开放地址法、链地址法,还有一些优化方法。
一、开放地址法(数组内部解决,不额外开空间)
核心:冲突了就往后找空位放
- 线性探测
冲突就+1、+2依次往后找,简单但容易聚集,效率下降。 - 二次探测
按平方步长找,缓解聚集。 - 双重哈希
用第二个哈希函数算步长,分散性最好。
缺点:删除麻烦、容易堆积、负载因子不能太高。
二、链地址法 / 拉链法(最常用,HashMap 用这个)
每个数组位置挂一个链表/红黑树
- 冲突的元素全部挂在同一个链表上
- Java HashMap:链表长度>8 转红黑树,<6 退化成链表
优点:实现简单、删除方便、负载因子可以更大;
缺点:需要额外存链表节点。
三、其他方法
- 再哈希法:冲突就换一个哈希函数重新算
- 建立公共溢出区:冲突数据统一放溢出表
面试问答
1. HashMap 用什么解决冲突?
链地址法(拉链法)+ 红黑树优化。
链表过长转红黑树,提高查询效率。
2. 开放地址法和链地址法怎么选?
- 数据量小、追求省内存 → 开放地址
- 数据量大、频繁增删 → 链地址法
1万+

被折叠的 条评论
为什么被折叠?



