【Java面试小短文】HashMap是如何解决Hash冲突的?
欢迎关注
Java
面试系列,不定期更新面试小短文。欢迎一键三连!
文章目录
- 什么是Hash算法?
- 什么是Hash表?
- HashMap是如何解决Hash冲突的?
什么是Hash算法?
Hash
算法,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出结果是一个散列值。
什么是Hash表?
Hash
表又叫做“散列表”,它是通过 key
直接访问在内存存储位置的数据结构, 在具体实现上,我们通过 hash
函数把 key
映射到表中的某个位置,来获取这个位置的数据,从而加快查找速度。如图:
HashMap是如何解决Hash冲突的?
HashMap
底层是采用数组结构来存储数据元素,数组的默认长度是16
,当我们通过put
方法去添加数据的时候,HashMap
会根据key
的hash
值进行取模运算,最终把这样一个值保存到数组的指定位置。
但是这样的设计方式会存在hash
冲突的问题,也就是两个不同的hash
值的key
,取模后会落到同一个数组下标,所以HashMap
引入了一个链式寻址法来解决hash
冲突的问题。也就是说对于存在冲突的key
,HashMap
把这些key
组成一个单向链表,然后采用尾插法把这样一个key
保存到链表的一个尾部,另外,为了避免链表过长导致查询效率下降,所以当链表长度大于8
并且数组长度大于等于64
的时候,HashMap
会把当前链表转换为红黑树,从而去减少链表数据查询的时间复杂度来提升查询效率。
解决hash
冲突的方法有很多,比如
- 链式寻址法。是一种非常常见的方法,简单理解就是把存在
hash
冲突的key
, 以单向链表的方式来存储,比如HashMap
就是采用链式寻址法来实现的。
如图,像这样一种情况,存在冲突的 key
直接以单向链表的方式进行存储。
- 开放寻址法,也称为线性探测法。就是直接从冲突的数组位置向下去寻找一个空的数组下标,进行数据的存储,在
ThredLocal
里面有使用到这个线性探测法。
如图:像这样一种情况,在 hash
表索引 1
的位置存了一个 key=name
,当再次添加 key=hobby
时,hash
计算得到的索引也是 1
,这个就是 hash
冲突。而线性探测法就是按顺序向前找到一个空闲的位置来存储冲突的 key
。
再哈希法。如果某个
hash
函数产生了冲突,那么再用另外一个hash
函数进行计算,一直计算直到不再产生冲突。这种方式会增加计算时间,性能影响较大。比如像布隆过滤器就采用了这种方法。建立公共溢出区。把
hash
表分为基本表和溢出表两个部分,把存在冲突的key
统一放在一个公共溢出区里面进行存储。
综上,HashMap
在 JDK1.8
版本中,通过链式寻址法+红黑树的方式来解决 hash
冲突问题,其中红黑树是为了优化 Hash
表链表过长导致时间复杂度增加的问题。当链表长度大于 8
并且 hash
表的容量大于等于 64
的时候,再向链表中添加元素就会触发转化。
欢迎一键三连~
有问题请留言,大家一起探讨学习
----------------------Talk is cheap, show me the code-----------------------
【Java面试小短文】HashMap是如何解决Hash冲突的?相关推荐
- java开放地址法和链地址法解决hash冲突
hashMap对各位小伙们来说,没有不知道的了,使用过的人想必或多或少的都了解一点hashMap的底层实现原理,总结来说就是,数组+链表,至于源码的实现,大家可参看源码,今天想说的是hashMap是怎 ...
- 【Java面试小短文】当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?
欢迎关注Java面试系列,不定期更新面试小短文.欢迎一键三连! 当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务? 当我们提交一个任务到线程池,它的工作原理如下: ...
- mysql映射成hashmap_大厂面试必问!HashMap 怎样解决hash冲突?
HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...
- 分享几个Java面试小技巧,建议收藏!
Java可谓编程界的元老,其资深地位无人撼动.那么学习Java的你,在面试时过五关斩六将还顺利吗?通常来讲,程序员的逻辑思维很清晰,在表达自我方面直接,但这在面试中可行不通,毕竟面试涉及到人际交流,所 ...
- GitHub上最火的两份Java面试小册,Star已经超百万
大家好,给大家带来两份GitHub上Star超百万的Java面试小册,独家整理!! Java面试小册内容涵盖Java.MyBatis.ZooKeeper.Dubbo.Elasticsearch.Mem ...
- 备战金九银十!【Java 面试小抄】涵盖当下最时新热门技术点,学完 offer 得拿到手软~
面试的重要性: 最近替公司面了几个应聘者,结果给我整抑郁了,9 点的面试 9 点 10 分才到!!!这还不是最重要的,重要的是穿着一眼就让人看出来没有对这场面试很重视的感觉!!但是小编还是面完了,很多 ...
- HashMap 怎样解决hash冲突?
HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...
- HashMap解决hash冲突的方法
HashMap解决hash冲突的方法 博客分类: jvm虚拟机 在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap ...
- HashMap 如何解决 hash 冲突
HashMap 底层采用数组的结构来存储数据元素,数组的默认长度是 16,通过 put 方法添加数据的时候,HashMap 根据 key 的 hash 值进行取模运算,最终保存到数组的指定位置 这种设 ...
最新文章
- 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。...
- 计算机二级没过学校要重修吗,如果学校说计算机二级没过不给发学位证改怎么办...
- 解决Java compiler level does not match the version of the installed Java project facet.问题
- ICEM(1)—边界结构网格绘制
- 004:2的幂次方表示
- c 语言生成json 文件,如何用c语言反序列化JSON文件#
- Kompose: Docker-compose 到 Kubernetes 的迁移工具
- 关于DatetTime?
- 计算机专业课考研八月份复习,2016考研:计算机专业暑期复习攻略
- 3Dmax玻璃材质参数应该怎样设置
- Flutter Web开发 浏览器运行
- 软件测试需要学数学,现在才开始学软件测试还有前途吗?
- 低温工作笔记本计算机,电脑低温自动关机
- HBase 2.x ---- HBase简介
- 《脑机接口导论》学习笔记 3.记录大脑的信号和刺激大脑
- 真香啊,推荐 6 个 Python 数据分析神器
- Vchat — 从头到脚,撸一个社交聊天系统(vue + node + mongodb)
- RecyclerView 结合cardview和materia degisn通过retrofit的一个项目,山寨it之家
- 产品功能树图_ISO9001:2015标准条款之8.2.2产品和服务要求的确定解析
- 华硕天选二FA506QM BIOS更新至311无法读取固态硬盘