怎么理解HashMap的数据结构、怎么解决冲突、扩容(面试必问版)

本文详细介绍了HashMap的数据结构、哈希冲突的处理方法(开放寻址法、链地址法、再哈希法),以及为何Java8选择使用红黑树优化性能。还探讨了负载因子的重要性,尤其是在0.75这个阈值上,以及何时进行扩容策略。
摘要由CSDN通过智能技术生成

2024一起卷吧

见者有缘,缘来好运🍀诚邀各位围观我的博客【CS_GUIDER】👇
🧑‍💻个人主页: wl2o2o
✒️博客主页: CSGUIDER(好玩) CSGUIDER(实用)
⭐八股专栏: JavaU8G(内置MusicPlayer)

我的开源博客涵盖了八股文、设计模式、网站搭建、数据库、Linux系统的教程和笔记。我致力于为您提供Java编程的实用指南和资源,包括Java框架、JVM、微服务以及Git。无论您是初学者还是经验丰富的开发人员,都可以从中获益。谢谢您的光临!

官方介绍

什么是 HashMap

我的理解

HashMap又称哈希表,又称散列表。首先,HashMap的数据结构是基于数组和链表的,如图:

HashMap数据结构

特点

so,既然是基于数组和链表的,那就说明数组和链表的特点也就是HashMap的特点:

  • 数组:寻址快,直接根据索引访问元素,插入和删除慢;

  • 链表:寻址慢,需要从头节点开始遍历,插入和删除快。

说到HashMap就要说到 Java 8 了,Java 8 之前,HashMap使用一个数组加链表的结构来存储 【K,V】 键值对。

如果发生 hash 冲突,那么,

这必将导致在处理 hash 冲突的时候性能不高,尤其是链表很长的时候。因此,Java 8 中的HashMap引入了红黑树来替代链表,这样当链表变长的时候,会自动转换为红黑树,从而提高了增删改查的性能。

什么是 Hash 冲突?怎么解决?

哈希冲突就是不同的数据经过哈希计算之后,得到的
hash值相同,然后被映射到了哈希表中的同一个位置,这就是哈希冲突。

解决方法:

  1. 开放寻址法
    意思就是,一旦发生冲突的话,就去按线性顺序寻找下一个空的散列地址,知道找到存放位置;
  2. 链地址法
    就是将哈希表数组的元素作为链表的头结点(这个链表的所有元素构成一个近义词链表,因为经过hash计算值相同),一旦哈希冲突,就把该关键字链接到该结点的尾部;
  3. 再哈希法
    顾名思义,就是再次通过另一个hash函数计算,得到另外的散列地址,直到冲突不发生;
  4. 建立公共溢出区
    将哈希表分为基本表溢出表,发生冲突的元素放入溢出表中。

负载因子为什么是 0.75 ?

对于开放寻址法,荷载因子是特别重要因素,应严格限制在0.7-0.8以下。超过0.8,查表时的CPU缓存不命中(cache missing)按照指数曲线上升。因此,一些采用开放寻址法的hash库,如Java的系统库限制了荷载因子为0.75,超过此值将resize散列表。

待完善··· ···

如何进行扩容?

如果 pv 达到500,马上进行完善!!!如果有收获,还请点个小指头👍,感谢🍀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CS_GUIDER

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值