欢迎关注Java面试系列,不定期更新面试小短文。欢迎一键三连!

文章目录

  • 什么是Hash算法?
  • 什么是Hash表?
  • HashMap是如何解决Hash冲突的?

什么是Hash算法?

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

什么是Hash表?

  Hash 表又叫做“散列表”,它是通过 key 直接访问在内存存储位置的数据结构, 在具体实现上,我们通过 hash 函数把 key 映射到表中的某个位置,来获取这个位置的数据,从而加快查找速度。如图:

HashMap是如何解决Hash冲突的?

  HashMap底层是采用数组结构来存储数据元素,数组的默认长度是16,当我们通过put方法去添加数据的时候,HashMap会根据keyhash值进行取模运算,最终把这样一个值保存到数组的指定位置。

  但是这样的设计方式会存在hash冲突的问题,也就是两个不同的hash值的key,取模后会落到同一个数组下标,所以HashMap引入了一个链式寻址法来解决hash冲突的问题。也就是说对于存在冲突的keyHashMap把这些key组成一个单向链表,然后采用尾插法把这样一个key保存到链表的一个尾部,另外,为了避免链表过长导致查询效率下降,所以当链表长度大于8并且数组长度大于等于64的时候,HashMap会把当前链表转换为红黑树,从而去减少链表数据查询的时间复杂度来提升查询效率。

解决hash冲突的方法有很多,比如

  1. 链式寻址法。是一种非常常见的方法,简单理解就是把存在 hash 冲突的 key, 以单向链表的方式来存储,比如 HashMap 就是采用链式寻址法来实现的。

如图,像这样一种情况,存在冲突的 key 直接以单向链表的方式进行存储。

  1. 开放寻址法,也称为线性探测法。就是直接从冲突的数组位置向下去寻找一个空的数组下标,进行数据的存储,在ThredLocal里面有使用到这个线性探测法。

  如图:像这样一种情况,在 hash 表索引 1 的位置存了一个 key=name,当再次添加 key=hobby 时,hash 计算得到的索引也是 1,这个就是 hash 冲突。而线性探测法就是按顺序向前找到一个空闲的位置来存储冲突的 key

  1. 再哈希法。如果某个hash函数产生了冲突,那么再用另外一个hash函数进行计算,一直计算直到不再产生冲突。这种方式会增加计算时间,性能影响较大。比如像布隆过滤器就采用了这种方法。

  2. 建立公共溢出区。把 hash 表分为基本表和溢出表两个部分,把存在冲突的key统一放在一个公共溢出区里面进行存储。

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

欢迎一键三连~

有问题请留言,大家一起探讨学习

----------------------Talk is cheap, show me the code-----------------------

【Java面试小短文】HashMap是如何解决Hash冲突的?相关推荐

  1. java开放地址法和链地址法解决hash冲突

    hashMap对各位小伙们来说,没有不知道的了,使用过的人想必或多或少的都了解一点hashMap的底层实现原理,总结来说就是,数组+链表,至于源码的实现,大家可参看源码,今天想说的是hashMap是怎 ...

  2. 【Java面试小短文】当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?

    欢迎关注Java面试系列,不定期更新面试小短文.欢迎一键三连! 当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务? 当我们提交一个任务到线程池,它的工作原理如下: ...

  3. mysql映射成hashmap_大厂面试必问!HashMap 怎样解决hash冲突?

    HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...

  4. 分享几个Java面试小技巧,建议收藏!

    Java可谓编程界的元老,其资深地位无人撼动.那么学习Java的你,在面试时过五关斩六将还顺利吗?通常来讲,程序员的逻辑思维很清晰,在表达自我方面直接,但这在面试中可行不通,毕竟面试涉及到人际交流,所 ...

  5. GitHub上最火的两份Java面试小册,Star已经超百万

    大家好,给大家带来两份GitHub上Star超百万的Java面试小册,独家整理!! Java面试小册内容涵盖Java.MyBatis.ZooKeeper.Dubbo.Elasticsearch.Mem ...

  6. 备战金九银十!【Java 面试小抄】涵盖当下最时新热门技术点,学完 offer 得拿到手软~

    面试的重要性: 最近替公司面了几个应聘者,结果给我整抑郁了,9 点的面试 9 点 10 分才到!!!这还不是最重要的,重要的是穿着一眼就让人看出来没有对这场面试很重视的感觉!!但是小编还是面完了,很多 ...

  7. HashMap 怎样解决hash冲突?

    HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...

  8. HashMap解决hash冲突的方法

    HashMap解决hash冲突的方法 博客分类: jvm虚拟机 在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap ...

  9. HashMap 如何解决 hash 冲突

    HashMap 底层采用数组的结构来存储数据元素,数组的默认长度是 16,通过 put 方法添加数据的时候,HashMap 根据 key 的 hash 值进行取模运算,最终保存到数组的指定位置 这种设 ...

最新文章

  1. 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。...
  2. 计算机二级没过学校要重修吗,如果学校说计算机二级没过不给发学位证改怎么办...
  3. 解决Java compiler level does not match the version of the installed Java project facet.问题
  4. ICEM(1)—边界结构网格绘制
  5. 004:2的幂次方表示
  6. c 语言生成json 文件,如何用c语言反序列化JSON文件#
  7. Kompose: Docker-compose 到 Kubernetes 的迁移工具
  8. 关于DatetTime?
  9. 计算机专业课考研八月份复习,2016考研:计算机专业暑期复习攻略
  10. 3Dmax玻璃材质参数应该怎样设置
  11. Flutter Web开发 浏览器运行
  12. 软件测试需要学数学,现在才开始学软件测试还有前途吗?
  13. 低温工作笔记本计算机,电脑低温自动关机
  14. HBase 2.x ---- HBase简介
  15. 《脑机接口导论》学习笔记 3.记录大脑的信号和刺激大脑
  16. 真香啊,推荐 6 个 Python 数据分析神器
  17. Vchat — 从头到脚,撸一个社交聊天系统(vue + node + mongodb)
  18. RecyclerView 结合cardview和materia degisn通过retrofit的一个项目,山寨it之家
  19. 产品功能树图_ISO9001:2015标准条款之8.2.2产品和服务要求的确定解析
  20. 华硕天选二FA506QM BIOS更新至311无法读取固态硬盘

热门文章

  1. Swft学习 传送门
  2. 浅谈如何推翻GRE阅读的固定思维
  3. 水稻插秧机分叉机构壳体零件数控加工工艺工装设计
  4. 谷歌支付“无法购买您要买的商品”
  5. Android测试(二):Android测试基础
  6. 如何修改maven本地仓库地址
  7. 指针式仪表的自动读数与识别
  8. Python 爬取B站视频信息 弹幕信息 生成词云统计
  9. centos7安装mplayer解码器
  10. 微信登录老是间歇式失败