HashMap相关面试题

HashMap采用数组+链表实现,解决hash冲突采用链表,当链表长度超过8时转为红黑树。扩容条件是bucket超过负载因子,扩容为2的次幂保证效率。JDK1.8优化包括链表转红黑树,头插法解决冲突。面试中会涉及HashMap的实现原理、扩容、冲突解决、key为何不可变以及并发问题,推荐使用ConcurrentHashMap解决并发问题。
摘要由CSDN通过智能技术生成

HashMap的实现原理

HashMap底层采用的是数组+链表实现的。一个Entry数组存储键值对,每一个键值对就是一个Entry实体。而Entry类实际是一个单向链表。在jdk1.8中规定了链表长度大于8的时候,链表转换为红黑树。
在这里插入图片描述

HashMap中数组和链表的作用

  1. 数组用于确定桶的位置,获得桶位置的计算方式是元素的key的hash值对数组长度取模。
  2. 链表解决hash冲突的问题。当hash值一样的时候就在数组上形成链表,而且才用的是头插法。什么是头插法?就是后进来的直接插入在头部。为什么呢?因为创始人觉得后进来的被访问的可能性更大。 在这里插入图片描述

hash冲突的解决方法

  1. 开放定址法
  2. 链地址法
  3. 再哈希法
  4. 公共溢出区法

可以用Linkedlist去替代数组吗?

可以的。但是在得到hash值的情况下,通过数组去确定桶的位置更快。

HashMap的扩容条件

如果bucket超过了load factor * current capacity,就要resize
load fator = 0.75,为了最大可能的避免哈希冲突。
current capacity 为当前数组大小

为什么扩容是2的次幂

  1. HashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同,这个实现就在把数据存到哪个链表中的算法;这个算法实际就是取模,hash%length
    但是,这种运算不如位移运算快。
    因此,源码中做了优化hash&(length-1)
    也就是说hash%length==hash&(length-1)
    所以,保证容积是2的n次方,是为了保证在做(length-1)的时候,每一位都能&1
    在这里插入图片描述

HashMap的put元素过程

  1. 对key的hashCode()经过扰动函数处理得到hash值,然后通过(n-1)&hash判断当前元素存储的位置。
  2. 如果没有碰撞,直接放入bucket里
  3. 如果碰撞了,就判断该元素与要存入的元素的hash值以及key是否相同。如果相同就更新value,保证key的唯一性。如果不同就通过拉链法解决冲突。以链表的形式存入bucket后。
  4. 如果链表中的元素达到了8个,就转为红黑色。
  5. 如果bucket满了就resize

HashMap的get元素过程

  1. 根据key的hashCode()进行hash运算,计算index
  2. 如果在bucket中第一个节点就命中了就返回;如果有冲突使用key.equal(k)去查找对应的Entry。

你知道哪些hash算法

  1. Hash函数是指把一个大范围映射到一个小范围
HashMap面试题主要涉及以下几个方面: 1. HashMap的底层数据结构是什么? HashMap的底层数据结构是数组。当进行put()操作时,会进行hash计算,确定对象在数组中的位置。如果多个对象的值在同一个数组位置上,就会出现hash冲突,此时会使用链表来解决冲突。 2. JDK 1.8为什么引入了红黑树? JDK 1.8引入红黑树是为了解决链表过长导致的性能问题。当链表长度超过一定阈值(默认为8),链表会转换为红黑树来提高查找效率。 3. HashMap的内部类Node<K,V>是什么作用? HashMap的内部类Node<K,V>实现了Entry接口,用于存储键值对的数据。每个Node对象表示一个映射关系,包含了键和值。 以上是关于HashMap的一些常见面试题,希望对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [史上最全Hashmap面试总结,51道附带答案,持续更新中...](https://blog.csdn.net/androidstarjack/article/details/124507171)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【硬核】HashMap最全面试题(附答案)](https://blog.csdn.net/weixin_43689480/article/details/118752906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值