HashMap面试知识点

news/2024/11/17 23:03:19/

一、HashMap实现原理

JDK1.7之前:HashMap由数组+链表组成。

JDK1.8之后:HashMap由数组+链表、红黑树组成,当链表长度超过8,且

二、HashMap中put()方法的过程

 ①首先检查数组table是否为空, 为空的话通过resize()方法进行创建。

  ②接着通过Hash函数计算key应该插入当数组的位置判断table[i]是否为空,为空的情况下直接插入,不为空的话判断table[i]的链表或树中是否有key,有key的话进行覆盖,没有的话进行插入操作,

  ③插入后如果为链表,需要判断是否长度大于8且table数组长度大于64,如果是的话转为红黑树

  ④size++,判断size大小是否大于threshold(负载因子 * table数组长度),如果大于的话,resize()方法进行扩容。

三、HashMap为什么是线程不安全的

 jdk1.7之前:HashMap链表的插入的方式是是头插法,在多线程的情况下,容易产生环形链表,查询时就会产生死循环问题。

 jdk1.8之后:HashMap的插入法改为了尾插法,但是多线程情况下依然会产生一些问题,例如前面说到的put()操作,有可能产生覆盖的情况。

  比如A、B两个线程put()插入同一个HashMap数组的位置,如果A操作判断该位置为null后时间片结束,那么B插入时该位置仍为空,会直接插入,当A线程继续执行插入操作时,该位置B插入的数据就会被覆盖掉了。

四、HashMap实现线程安全的几种形式

①HashTable

  不推荐,HashTable将几乎所有方法都使用了synchronized加锁,效率较低

②ConcurrentHashMap

  jdk1.7之前:将数据分成一段一段(Segment),每一段数据配一把锁,Segment 继承了ReentrantLock 所以Segment 是一种可重入锁。一个Segment包含一个HashEntry的数组。

  jdk1.8之后:取消了Segment分段锁,使用Node + CAS + synchronized,其中synchronized只锁红黑树或者链表的头结点,锁的粒度更细,效率更高。

五、HashMap的扩容机制

  HashMap的默认负载因子是0.75,当元素个数 > 0.75 * 数组长度时,开始扩容,数组长度变为之前的2倍。

六、HashMap为什么采用2倍扩容

    在解答这个问题之前,我们要知道二进制的取模 % 运算可以视为 & 运算。 向HashMap插入一个val值时,判断该val应该处于数组哪个位置的方法就是 val %( length - 1)。

   因此,HashMap的2倍会使得扩容后更新数据位置非常容易。比如当前HashMap的length为8,二进制为1000, length - 1 为 111,2倍扩容后,length扩大到16.只需要左移一位变为10000, length - 1是1111。对于需要更新位置的val,只需要多%1位就可以了,这一位就是length-1新增的那个位置,如果val的该位为0,那么val % length - 1的值也不会变,位置不需要变化;如果该位为1,那么val的位置只需要增加数组扩大的长度即可。

hash =         10101100                                             

length - 1 =            111

index =                   100

扩容后:

hash =         10101100

length - 1 =           1111

index =                 1100


http://www.ppmy.cn/news/1547824.html

相关文章

从零开始学习 sg200x 多核开发之 eth0 dhcpc 配置

前面已经介绍过 sophpi 的启动过程和 eth0 静态 IP 地址配置。不过静态 IP 在使用的时候比较不通用,本文介绍 eth0 自动使能并配置 dhcp 功能。 udhcpc udhcpc 是 BusyBox 工具集中的一个组件,用于从 DHCP 服务器获取网络配置信息,如 IP 地…

RabbitMQ常⻅⾯试题

1. MQ的作⽤及应⽤场景 类似问题: 项⽬什么场景下使⽤到了MQ, 为什么需要MQ RabbitMQ 的作⽤? 使⽤场景有哪些 RabbitMQ的主要应⽤场景 消息队列解耦应⽤程序的例⼦ 消息队列的应⽤场景 为什么说消息队列可以削峰 异步解耦: 在业务流程中, ⼀些操作可能⾮常耗时, 但…

嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)

引言:对于嵌入式硬件这个庞大的知识体系而言,太多离散的知识点很容易疏漏,因此对于这些容易忘记甚至不明白的知识点做成一个梳理,供大家参考以及学习,本文主要针对芯片输入接入0.1uf电容的本质的知识点的进行学习。 目…

如何知道表之间的关系(为了知识图谱的构建)

今天就简单点,把今天花时间做的一个程序说下。 我们在做常规知识图谱的时候,面临一个问题就是要知道关系是如何建立。如果表的数量比较少,人工来做还是比较容易的。 如果有非常多的表,并且这些表之间的关联关系都不清楚的情况下…

vscode报错:Connecting with SSH time-out.

当我们在vscode上远程连接(Remote_SSH)Linux时,如果直接点关闭vscode,下次远程登陆后,就会弹出以下界面, 点击重新加载window就会弹出以下报错: 这是因为我们没有正常关闭remote-ssh, 导致linux上有多个vsc…

执行npm run build -- --report后,生产report.html文件是什么?

‌ 执行npm run build -- --report后,生成的report.html文件是一个打包分析报告,它详细记录了项目的打包结果和各个文件的大小信息。‌ 这个报告文件通常包含以下内容: ‌文件大小信息‌:报告会列出项目中每个文件的大小&#…

记录一下跨域的问题,讲讲跨域

一、为什么有跨域 跨域问题本质上是由于浏览器的同源策略(Same Origin Policy)引起的。这个策略是为了增强网页的安全性,防止恶意网站获取用户的敏感信息。也就是说经过浏览器的才有跨域,在前端代码中进行数据请求的时候往往都要…

地质旅游平台推动“旅游+地质”融合发展

2024年元旦假期,哈尔滨文旅市场持续火爆。据哈尔滨市文化广电和旅游局大数据测算,截至1月1日,哈尔滨市累计接待游客304.79万人次,实现旅游总收入59.14亿元,游客接待量与旅游总收入达到历史峰值。 夏有进“淄”赶烤&…