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

news2024/12/23 8:53:42
(本文摘自mic老师面试文档)
常用数据结构基本上是面试必问的问题,比如 HashMap、LinkList、 ConcurrentHashMap 等。
关于 HashMap,有个学员私信了我一个面试题说: “HashMap 是怎么解决哈希冲突
的?”
关于这个问题,我们来模拟一下普通人和高手对于这个问题的回答。
普通人
嗯.... HashMap 我好久之前看过它的源码,我记得好像是通过链表来解决的!
高手
嗯,这个问题我从三个方面来回答。
1. 要了解 Hash 冲突,那首先我们要先了解 Hash 算法和 Hash 表。(如图)
a. Hash 算法,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出结果是散列值。
b. Hash 表又叫做“散列表”,它是通过 key 直接访问在内存存储位置的数据结 构,在具体实现上,我们通过 hash 函数把 key 映射到表中的某个位置,来获 取这个位置的数据,从而加快查找速度。
c. 所谓 hash 冲突,是由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,所以总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。
d. 通常解决 hash 冲突的方法有 4 种。
i. 开放定址法,也称为线性探测法,就是从发生冲突的那个位置开始,按照 一定的次序从 hash 表中找到一个空闲的位置,然后把发生冲突的元素存 入到这个空闲位置中。ThreadLocal 就用到了线性探测法来解决 hash 冲 突的。
向这样一种情况(如图),在 hash 表索引 1 的位置存了一个 key=name,当再次添加 key=hobby 时,hash 计算得到的索引也是 1,这个就是 hash 冲突。而开放定址法, 就是按顺序向前找到一个空闲的位置来存储冲突的 key。
ii. 链式寻址法,这是一种非常常见的方法,简单理解就是把存在 hash 冲突 的 key,以单向链表的方式来存储,比如 HashMap 就是采用链式寻址法 来实现的。
向这样一种情况(如图),存在冲突的 key 直接以单向链表的方式进行存储。
iii. 再 hash 法,就是当通过某个 hash 函数计算的 key 存在冲突时,再用另
外一个 hash 函数对这个 key 做 hash,一直运算直到不再产生冲突。这种
方式会增加计算时间,性能影响较大。
iv. 建立公共溢出区, 就是把 hash 表分为基本表和溢出表两个部分,凡事存
在冲突的元素,一律放入到溢出表中。
e. HashMap 在 JDK1.8 版本中,通过链式寻址法+红黑树的方式来解决 hash 冲
突问题,其中红黑树是为了优化 Hash 表链表过长导致时间复杂度增加的问题。
当链表长度大于 8 并且 hash 表的容量大于 64 的时候,再向链表中添加元素
就会触发转化。
以上就是我对这个问题的理解! 结尾
这道面试题主要考察 Java 基础,面向的范围是工作 1 到 5 年甚至 5 年以上。
因为集合类的对象在项目中使用频率较高,如果对集合理解不够深刻,容易在项目中制
造隐藏的 BUG。
所以,再强调一下,面试的时候,基础是很重要的考核项!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis极速上手开发手册【Redis全面复习】

文章目录 什么是RedisRedis的特点Redis的应用场景Redis安装部署Redis基础命令Redis多数据库特性Redis数据类型Redis数据类型之stringRedis数据类型之hashRedis数据类型之listRedis数据类型之setRedis数据类型之sorted set案例:存储高一班的学员信息 Redis封装工具类…

DevExpress WinForms桑基图组件,开创大数据流可视化新方式!

界面控件DevExpress WinForms能帮助开发者创建信息丰富的WinForms应用程序,使用其Sankey Diagram(桑基图)控件,您可以非常轻松地可视化大数据的数据流。 DevExpress WinForms有180组件和UI库,能为Windows Forms平台创…

获奖名单出炉 ,鲲鹏应用创新大赛2023全国总决赛圆满落幕

11月2日,以“数智未来 因你而来”为主题的鲲鹏应用创新大赛2023全国总决赛在四川成都顺利举办。经过长达6个月的层层筛选与激烈角逐,最终从三大赛事、5大赛道中评选出了13个金奖、16个银奖、19个铜奖。 鲲鹏应用创新大赛是面向全球开发者的顶级赛事&…

DxO照片处理工具合集:FilmPack+PureRAW+PhotoLab+ViewPoint中文版

DxO照片处理工具合集是一款强大而全面的图像处理软件,它可以帮助您提升照片的质量,使其更加出色。无论您是一名专业摄影师,还是一个热爱摄影的业余爱好者,DxO照片处理工具合集都能满足您的需求,让您的照片更加出众&…

单元测试框架----UnitTest框架

UnitTest框架核心要点:TestCase(测试用例)、TestSuite(测试套件)、TextTestRunner(测试执行器)、TextTestResult(测试报告)、Fixture(测试夹具) TestSuite 步骤: 步骤1&#xff1a…

git解决冲突的方法。

1、 cherry-pick git fetch ssh://jingyou.caigerrit.transtekcorp.com:29418/leshan refs/changes/23/34123/3 && git cherry-pick FETCH_HEAD2、 文件解冲突! 3、 cherry-pick完整。 git cherry-pick --continue4、查看状态。 5、 push。 git push o…

ChatGPT如何管理对话历史?

问题 由于现在开始大量使用ChatGPT对话功能,认识到他在提供启发方面具有一定价值。比如昨天我问他关于一个微习惯的想法,回答的内容还是很实在,而且能够通过他的表达理解自己的问题涉及到的领域是什么。 此外,ChatGPT能够总结对话…

Stable Diffusion:最先进的文本生成图像模型

稳定扩散 生成式 AI 技术正在迅速发展,现在可以简单地根据文本输入生成文本和图像。Stable Diffusion 是一种文本到图像模型,使您能够创建逼真的应用程序。 扩散模型通过学习去除添加到真实图像中的噪声进行训练。这种降噪过程会产生逼真的图像。这些模…

第一章《补基础:不怕学不懂微积分》笔记

微积分包含众多知识点,例如极限概念、求导公式、乘积法则、链式法则、隐函数求导、 积分中值定理、泰勒公式等。其中,研究导数、微分及其应用的部分一般称为微分学,研究不定积分、定积分及其应用的部分一般称为积分学。微分学和积分学统称为微…

增强swagger

<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>${org.springdoc.version}</version> </dependency> Swagger版本要与springboot 版本对应 2.1.0 -&…

携手武重集团共建新营销一体化平台,助推央企迈向世界一流

党的二十大报告指出&#xff0c;深化国资国企改革&#xff0c;加快国有经济布局优化和结构调整&#xff0c;推动国有资本和国有企业做强做优做大&#xff0c;提升企业核心竞争力&#xff0c;加快建设世界一流企业。 在数字中国建设的新时新征程中&#xff0c;数字化转型赋能央…

引入依赖时,右键能点击进入,运行时报错

引入依赖时&#xff0c;右键能点击进入&#xff0c;运行时报错 一、问题二、解决问题的过程三、解决方式1、排除其中一个依赖的公共包2、升级旧依赖 一、问题 我的问题是这样的&#xff1a;以前引入了阿里云文字识别的依赖&#xff0c;最近要调用视频活体检测的接口&#xff0…

Linux CentOS 8(HTTPS的配置与管理)

Linux CentOS 8&#xff08;HTTPS的配置与管理&#xff09; 目录 一、HTTPS 介绍二、SSL 证书的介绍三、实验配置 一、HTTPS 介绍 HTTPS 在 HTTP 的基础下加入 SSL&#xff0c;SSL 是“Secure Sockets Layer”的缩写&#xff0c;中文为“安全套接层”。因此 HTTPS 是以安全为目…

解决MySQL需要根据特定顺序排序

文章目录 0 写在前面1 问题引入2 问题解决3 写在末尾 0 写在前面 在进行业务需求的时候&#xff0c;不会根据排序去选择数据。例如&#xff0c;在导出的时候数据排序是根据编辑时间去排序的&#xff0c;那么他的主键id会打乱。 假如&#xff1a; 要导出id为 3 &#xff0c;1 &…

Python学习笔记--构造(`__new__`)和初始化(`__init__`)

二、构造(__new__)和初始化(__init__) 通过之前的学习&#xff0c;我们已经知道定义一个类时&#xff0c;我们经常会通过 __init__(self) 的方法在实例化对象的时候&#xff0c;对属性进行设置。 比如下面的例子&#xff1a; #!/usr/bin/env python3 # -*- coding: UTF-8 -*…

WordPress页脚配置备案号

进入后台管理页面 后台管理页面地址一般是&#xff1a;域名/wp-admin 在指定位置加入代码 点击外观 -> 主题文件编辑器 在右侧的文件中选择 footer.php,[注意&#xff1a;上方的主题需要是你自己选择的对应的主题]在 </footer>标签这一行的上一行中加入代码 <di…

MySQL最新2023年面试题及答案,汇总版(1)【MySQL最新2023年面试题及答案,汇总版-第三十一刊】

文章目录 MySQL最新2023年面试题及答案&#xff0c;汇总版(1)01、什么是存储过程&#xff1f;用什么来调用&#xff1f;02、优化数据库有哪些方法&#xff0c;详细说明其使用方式&#xff1f;03、MySQL完整性约束包括哪些&#xff1f;04、使用B树的好处有哪些&#xff1f;05、视…

Python Collections:解放你的数据处理能力

导语&#xff1a; Python中的collections模块为我们提供了丰富的数据结构和高效的操作方法&#xff0c;让我们能够更轻松地处理各种数据。本文将详细介绍Python collections的高端操作使用教程&#xff0c;帮助你更好地利用这些强大的工具&#xff0c;提升数据处理的效率和质量…

Qt文本编辑器避免在新窗口打开链接的设置方法

如何避免在新窗口打开链接&#xff0c;在Qt的主菜单:工具->选项->文本编辑器->显示->Always open links in another split去掉即可。

Java安全架构 JCA、JCE、JSSE、JAAS

Java语言拥有三大特征&#xff1a;平台无关性、网络移动性和安全性&#xff0c;而Java安全体系结构对这三大特征提供了强大的支持和保证&#xff0c; Java安全体系结构总共分为4个部分&#xff1a; &#xff08;1&#xff09;JCA&#xff08; Java Cryptography Architecture…