HashMap如何解决哈希冲突

这篇具有很好参考价值的文章主要介绍了HashMap如何解决哈希冲突。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Hash算法和Hash表

Hash算法就是把任意长度的输入通过散列算法编程固定长度的输出。这个输出结果就是一个散列值
HashMap如何解决哈希冲突
Hash表又称为“散列表”,它是通过key直接访问到内存存储位置的数据结构。在具体的实现上,我们通过Hash函数把key映射到表中的某个位置,来获取这个位置的数据,从而去加快数据的查找。

Hash冲突

所谓的Hash冲突是由于哈希算法被计算的数据是无限的。而计算后的结果的范围是有限的。

所以总会存在不同的数据经过计算之后得到的值是一样的。那么这种情况下就会出现所谓的哈希冲突。

解决哈希冲突的方法

通常解决哈希冲突的方法有四种

开放地址法

也称线性探测法,就是从发生冲突的那个位置开始,按照一定次序,从Hash表中去找到一个空闲的位置,然后把发生冲突的元素存入到这个位置。

而在Java中,ThreadLocal就用到了线性探测法来解决Hash冲突

HashMap如何解决哈希冲突
像这种情况,在Hash表索引1的位置存了一个key=name,再向它添加key=hobby的时候,假设Hash计算得到的索引也是1。那么这个时候,我们称为Hash冲突。而开放地址法就是按照顺序向前去找到一个空闲的位置来存储这个冲突的key。

链式寻址法

把存在Hash冲突的key以单向链表的方式来进行存储。比如HashMap就用到了链式寻址法来实现。
HashMap如何解决哈希冲突
存在冲突的key直接以单向链表的方式去进行存储。

再hash法

某个Hash函数计算的Key存在冲突的时候,再用另外一个Hash函数对这个Key进行Hash,一直运算直到不再产生冲突为止。

这种方式会增加计算的时间。性能上会有一些影响。

建立公共溢出区

把Hash表分为基本表溢出表这两个部分。凡是存在冲突的元素一律放到溢出表中。

HashMap在JDK 1.8版本中是通过链式寻址法以及红黑树的方式来解决Hash冲突问题的。

其中红黑树是为了优化Hash表的链表过长导致时间复杂度增加的一个问题。当链表长度大于8并且给Hash表的容量大于64的时候,再向链表中添加元素,就会触发链表向红黑树的一个转换。

参考资料:【Java面试】数据结构面试必问题,HashMap如何解决哈希冲突?文章来源地址https://www.toymoban.com/news/detail-425294.html

到了这里,关于HashMap如何解决哈希冲突的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】04 哈希表 / 散列表 (哈希函数、哈希冲突、链地址法、开放地址法、SHA256)

    一种很好用,很高效,又一学就会的数据结构,你确定不看看? 莫慌,每个概念都很好理解。 哈希表( Hash Table ),也称为 散列表 ,是一种数据结构, 用于存储键值对(key-value pairs) 。 键值对是一种数据结构,用于将键(key)与对应的值(value)相关联。在键值对中,键

    2024年02月09日
    浏览(63)
  • 解决哈希冲突的几种方法

    哈希函数是一个映像,把任意长度的输入,通过Hash算法变换成固定长度的输出,这个输出就是Hash值; 当两个不同的输入,产生了同一个输出值即为哈希冲突 开放寻址法的核心思想是, 如果出现了散列冲突,我们就重新探测一一个空闲位置,将其插入 。比如,我们可以使用

    2024年01月17日
    浏览(24)
  • 查找算法【哈希表】 - 处理冲突的方法:开放地址法-线性探测法

    查找算法【哈希表】 - 处理冲突的方法 无论如何设计散列函数,都 无法避免 发生冲突。 如果发生冲突,就需要处理冲突。 处理冲突的方法分为3种: 开放地址法 链地址法 建立公共溢出区。 【开放地址法】 开放地址法是线性存储空间上的解决方案,也被称为闭散列。 当发

    2024年02月12日
    浏览(25)
  • 解决Hash(哈希表)冲突的四种方案

    参考鸣谢 解决哈希冲突必须知道的几种方法 小僵鱼 你还应该知道的哈希冲突解决策略 vivo互联网技术 解决哈希冲突的三种方法 kaleidoscopic 每日一题(哈希表及哈希冲突解决办法) 和笙 哈希是一种通过对数据进行压缩, 从而提高效率的一种解决方法 ,但由于哈希函数有限,数据

    2024年02月14日
    浏览(36)
  • 【数据结构】 | java中 哈希表及其冲突解决

    🎗️ 博客新人,希望大家一起加油进步 🎗️ 乾坤未定,你我皆黑马 1、哈希表概念 顺序结构以及平衡树中 ,元素关键码与其存储位置之间没有对应的关系,因此在 查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(Lo

    2024年01月19日
    浏览(38)
  • 【数据结构】万字一文手把手解读哈希————(开/闭散列)解决哈希冲突完整详解(6)

    前言 大家好吖,欢迎来到 YY 滴 数据结构 系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《

    2024年02月04日
    浏览(48)
  • 查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

    查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 随机探测法 再散列法 【二次探测法】 二次探测法指采用前后跳跃式探测的方法,发生冲突时,向后1位探测,向前1位探测,向后2^2 位探测,向前2^2 位探测……以跳跃式探测,避免堆积。 二次探测的增量序列为

    2024年02月10日
    浏览(27)
  • 数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)

    目录 开放地址法(Open Addressing) 线性探测(Linear Probing) 散列表查找性能分析 平方探测(Quadratic Probing)  定理 平方探测法的查找与插入 双散列探测法(Double Hashing)  再散列(Rehashing) 分离链接法(Separate Chaining) 平均查找次数 分离链接法的散列表实现 常用处理冲突的

    2024年02月08日
    浏览(52)
  • Rust 笔记:Rust 语言中哈希结构(哈希映射,HashMap)、集合(哈希集,HashSet)及其使用

    Rust 笔记 Rust 语言中映射(HashMap)与集合(HashSet)及其用法 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/130876735 【介绍】:本文介绍 Rust 中哈希结构相关概念及其使用。在 R

    2024年02月09日
    浏览(38)
  • 哈希表HashMap(基于vector和list)

    C++数据结构与算法实现(目录) 1 什么是HashMap? 我们这里要实现的HashMap接口不会超过标准库的版本(是一个子集)。 HashMap是一种键值对容器( 关联容器 ),又叫 字典 。 和其他容易一样,它可以对存储的元素进行 增删改查 操作。 它之所以叫关联容器,是因为它的每个元

    2024年02月10日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包