您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

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

时间:2023-09-11 14:41:50  来源:微信公众号  作者:程序员的故事

前言

       今天来分享一道比较好的面试题,“HashMap 是怎么解决哈希冲突的?”对于这个问题,我们一起看看考察点和比较好的回答吧!

考察点

      现在的企业级开发中HashMap几乎是最常用到的容器,了解HashMap 是怎么解决哈希冲突的,有助于我们开发出更加优秀的代码。那么这个问题就是面试官想考察我们是不是平日里善于积累,仔细思考这方面的知识!

回答  

关于这个问题,我从三个方面来回答:

1.hash冲突的基础就是hash算法和hash表这种数据结构。先讲讲hash算法和hash表。

①Hash 算法,就是通过散列算法,把任意长度的输入变成固定长度的输出。这个输出就是散列值。

hashValue1  = hash(inputStr1);
hashValue2  = hash(inputStr2);
hashValue1和hashValue2的长度一样
  • 1.
  • 2.
  • 3.

②Hash 表又叫做“散列表”,其本质是通过key,可以直接访问在内存存储位置的数据结构。因此在表现上,我们可以通过hash函数把key映射到散列表中的某个位置,进而获取这个位置的数据,这样能够加快查找速度。

③那么我们所说的hash 冲突,因为哈希算法计算的数据是无穷的,而计算的结果范围是有限的,这样就会造成不同的输入得到的结果确实一样的情况。也就是说发生了冲突。如图所示:

2.如何结果hash冲突呢?这里讲一下常用的4中方法。

①开放定址法,也被称为线性探测法,其原理是这样的,从发生冲突的那个位置开始,通过一定的次序从hash表里面找一个空闲的位置。之后将发生冲突的元素存入到这个空闲位置中。在应用上面,我们常见的ThreadLocal就是用到了线性探测法来解决hash冲突。如图,在 hash 表索引 1 的位置存了一个 key=name,当再次添加key=hobby 时hash 计算得到的索引也是 1,这个就是 hash 冲突。而开放定址法,就是按顺序向前找到一个空闲的位置来存储冲突的 key。

②链式寻址法,这是一种非常常见的方法,简单理解就是把存在 hash 冲突的 key,以单向链表的方式来存储,比如 HashMap 就是采用链式寻址法来实现的。向这样一种情况(如图),存在冲突的 key 直接以单向链表的方式进行存储。

③再 hash 法,就是当通过某个 hash 函数计算的 key 存在冲突时,再用另外一个 hash 函数对这个 key 做 hash,一直运算直到不再产生冲突。这种方式会增加计算时间,性能影响较大。

④. 建立公共溢出区, 就是把 hash 表分为基本表和溢出表两个部分,凡是存在冲突的元素,一律放入到溢出表中。

3.HashMap 在 JDK1.8 版本中,通过链式寻址法+红黑树的方式来解决 hash 冲突问题,其中红黑树是为了优化 Hash 表链表过长导致时间复杂度增加的问题。当链表长度大于 8 并且 hash 表的容量大于 64 的时候,再向链表中添加元素就会触发转化。

以上就是我对于这个问题的理解。



Tags:HashMap   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
前言 今天来分享一道比较好的面试题,“HashMap 是怎么解决哈希冲突的?”对于这个问题,我们一起看看考察点和比较好的回答吧!考察点 现在的企业级开发中HashMap几乎是...【详细内容】
2023-09-11  Tags: HashMap  点击:(0)  评论:(0)  加入收藏
HashMap线程不安全体现在哪里?如果你到现在还不清楚赶紧看下去,明明白白补一补~。在Java中,HashMap是一种常用的数据结构,它以键值对的形式存储和管理数据。然而,由于HashMap在...【详细内容】
2023-04-27  Tags: HashMap  点击:(111)  评论:(0)  加入收藏
要实现线程安全的 HashMap,可以考虑以下几种方法: 使用 ConcurrentHashMap:ConcurrentHashMap 是线程安全的 HashMap 实现,采用了分段锁的机制,可以提高并发性能。 使用 Collecti...【详细内容】
2023-03-21  Tags: HashMap  点击:(221)  评论:(0)  加入收藏
HashMap 死循环发生在 JDK 1.7 版本中,形成死循环的原因是 HashMap 在 JDK 1.7 使用的是头插法,头插法 + 链表 + 多线程并发 + HashMap 扩容,这几个点加在一起就形成了 HashMap...【详细内容】
2023-01-31  Tags: HashMap  点击:(136)  评论:(0)  加入收藏
写在前面最近有很多的粉丝私信我,说自己在面试的时候,老是被人问HashMap的原理,但是在实际的工作中,也只是使用HashMap,从来就没有关注过它的原来,今天博主本人,根据自己的实际经验...【详细内容】
2022-09-08  Tags: HashMap  点击:(144)  评论:(0)  加入收藏
1、HashMap主要成员变量size 记录了 Map 中 KV 对的个数。loadFactor 装载印子,用来衡量 HashMap 满的程度。loadFactor 的默认值为 0.75f。threshold 临界值,当实际 KV 个数...【详细内容】
2021-06-08  Tags: HashMap  点击:(434)  评论:(0)  加入收藏
场景描述我们在日常学习和研发中,经常会接触一些底层的源码,有些同学在遇到位运算(提高系统的运行效率)实现的方法时,读起来就有些吃力了,例如HashMap类中的tableSizeFor(int cap...【详细内容】
2021-04-06  Tags: HashMap  点击:(383)  评论:(0)  加入收藏
前言本文咱们了解一下红黑树的设计,相比 jdk1.7 的 HashMap 而言,jdk1.8 最重要的就是引入了红黑树的设计,当冲突的链表长度超过 8 个的时候,链表结构就会转为红黑树结构。01、...【详细内容】
2021-01-18  Tags: HashMap  点击:(267)  评论:(0)  加入收藏
本节让我们一起研究一下该容器是如何在保证线程安全的同时又能保证高效的操作。 ConcurrentHashMap 是线程安全且高效的 HashMap 。...【详细内容】
2020-10-16  Tags: HashMap  点击:(190)  评论:(0)  加入收藏
絮叨学校短学期刚结束了,离学校开学还有很多天,一直呆在寝室玩游戏岂不是浪费了大好时光,于是心血来潮想看看HashMap的源码。虽然我没有经历过面试,但是java程序员都知道,HashMap...【详细内容】
2020-09-27  Tags: HashMap  点击:(195)  评论:(0)  加入收藏
▌简易百科推荐
译者 | 刘涛审校 | 重楼在去中心化网络的世界里,计算机需要在没有中心权威控制的情况下协作。共识算法是帮助它们合作并找到共同基础的关键所在。这些算法确保网络中的所有节...【详细内容】
2023-09-12    51CTO  Tags:共识算法   点击:(2)  评论:(0)  加入收藏
前言 今天来分享一道比较好的面试题,“HashMap 是怎么解决哈希冲突的?”对于这个问题,我们一起看看考察点和比较好的回答吧!考察点 现在的企业级开发中HashMap几乎是...【详细内容】
2023-09-11  程序员的故事  微信公众号  Tags:HashMap   点击:(0)  评论:(0)  加入收藏
当谈到数据结构与算法,特别是动态规划和空间复杂度时,有一个清晰的理解是非常重要的。让我们从动态规划算法的基本思想和应用开始,然后深入研究动态规划算法的空间复杂度和时间...【详细内容】
2023-09-06  树言树语Tree  今日头条  Tags:算法   点击:(14)  评论:(0)  加入收藏
你对正则表达式有何看法?我猜你会说这太晦涩难懂了,我对它根本不感兴趣。是的,我曾经和你一样,以为我这辈子都学不会了。但我们不能否认它确实很强大,我在工作中经常使用它,今天,我...【详细内容】
2023-09-05  web前端开发  微信公众号  Tags:正则表达式   点击:(20)  评论:(0)  加入收藏
作者 | 弘远君导读introduction本文以百度垂类离线计算系统的演进方向为主线,详细描述搜索垂类离线计算系统发展过程中遇到的问题,以及对应的解决方案。架构演进过程中一直奉...【详细内容】
2023-09-01  OSC开源社区    Tags:垂类离线计算   点击:(22)  评论:(0)  加入收藏
前面的几篇文章,作者深入探讨过RLHF 的算法原理,今天站在一定高度讨论,为什么需要RLHF 这么复杂的强化学习算法,为什么SL(监督学习) 不能达到这样一个效果?这篇文章就从Sebastian...【详细内容】
2023-08-31  机器学习搬运工    Tags:算法   点击:(26)  评论:(0)  加入收藏
当谈到数据结构与算法,理解复杂度是非常重要的,因为它可以帮助你评估算法的性能以及在不同情况下的表现。在分析算法的复杂度时,我们通常关注三种情况:最坏情况、平均情况和最好...【详细内容】
2023-08-31  树言树语Tree    Tags:算法   点击:(29)  评论:(0)  加入收藏
前言如果嫌麻烦,你可以直接跳到正题观看~最近无论是在工作中的交谈,还是在日常刷屏的新闻,铺天盖地的都是大模型。我横竖是看不明白,费了大劲终于从字缝里看到了两个字,玄学。仿...【详细内容】
2023-08-30    OSC开源社区  Tags:算法   点击:(30)  评论:(0)  加入收藏
我们假设B+树一个节点可以有100个关键字,那么3层的B树可以容纳大概1000000多个关键字(100+101100+101101*100)。而红黑树要存储这么多至少要20层。所以使用B树相对于红黑树和A...【详细内容】
2023-08-29  做好一个程序猿    Tags:搜索树   点击:(29)  评论:(0)  加入收藏
随着人工智能技术的迅猛发展,深度学习成为了解决复杂问题的有力工具。然而,深度学习模型的训练过程常常需要大量的计算资源,而在实际应用中,模型的推理阶段同样需要高效的计算支...【详细内容】
2023-08-28  亚托克索的日记    Tags:深度学习   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条