版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
HashMap高频面试题及详细真实答案(实战版)一、基础概念类(入门必问)1.说说HashMap的底层数据结构?Java7和Java8有什么区别?答案:HashMap核心是「数组+链表+红黑树」的结构,Java7和Java8改动很大,核心区别如下:Java7底层:数组+单向链表。没有红黑树,哈希冲突多的时候,链表会无限变长,查询效率极低。Java8底层:数组+单向链表+红黑树。当链表长度超过8且数组容量大于64时,链表转为红黑树;当红黑树节点数小于6时,退化为链表。额外关键区别:1)Java7链表插入是头插法,Java8改为尾插法,解决了并发扩容的循环链表死循环问题;2)Java8优化了哈希扰动算法,减少哈希冲突概率;3)Java8扩容时会重新拆分链表,不需要全部重新计算哈希,效率更高。2.HashMap的工作原理是什么?put流程简单说一下答案:整体就是:通过哈希算法定位数组下标,判断位置是否有元素,再区分链表/红黑树插入,最后判断是否需要扩容。具体流程:1)先对key做hash运算(二次扰动),算出数组下标;2)如果对应数组下标位置为空,直接新建节点放入数据;3)如果位置有元素,说明发生哈希冲突:-若首节点key和当前key完全一致(hash值相等+equals相等),直接覆盖旧值;-若首节点是树节点,走红黑树插入逻辑;-若还是链表,遍历链表尾部插入新节点;插入后判断链表长度是否超过8、数组容量是否大于64,满足则转红黑树;4)插入完成后,判断当前元素数量是否超过阈值(容量*负载因子),超过则触发扩容。3.为什么HashMap的数组容量必须是2的幂次?答案:核心是为了高效取模计算下标。正常取模运算%效率很低,而如果容量是2的n次方,hash&(容量-1)的结果和hash%容量结果完全一致,但位运算速度快得多。同时还有一个好处:扩容时可以快速拆分元素。扩容为原容量2倍后,元素只可能在原位置或原位置+原容量位置,不需要重新计算哈希,提升扩容效率。如果初始化传入非2的幂次,HashMap会自动向上取最近的2的幂次,比如传入10,实际容量是16。4.负载因子是什么?默认0.75为什么不改成1或者0.5?答案:负载因子(loadFactor)是HashMap的扩容阈值系数,默认0.75。阈值=容量*负载因子,元素数量超过阈值就扩容。不同取值的取舍:1)负载因子越大(比如1):数组填满才扩容,空间利用率极高,但哈希冲突会大幅变多,链表/树变长,查询、插入性能下降;2)负载因子越小(比如0.5):扩容频繁,冲突极少,性能好,但大量空间闲置,内存浪费严重;3)0.75是官方权衡空间利用率和查询性能的最优值,数学上哈希冲突概率最低,是综合最优解。二、核心源码与阈值问题(中频必考)5.链表转红黑树的条件?为什么是8和6?答案:转树两个条件必须同时满足:1)链表长度>=8;2)数组容量>=64;如果数组容量小于64,只会触发扩容,不会转树,避免小容量数组无谓的树化开销。树退化成链表条件:红黑树节点数<=6。为什么用8和6,不是7、9?1)根据概率统计,哈希均匀的情况下,链表长度达到8的概率极低,属于极端哈希冲突场景,才需要树化;2)红黑树节点占用内存比链表节点大很多,短链表用链表遍历更快,没必要树化;3)8和6设置了缓冲区间,避免节点数量在临界值反复横跳,频繁树化、退化,导致性能抖动。6.HashMap的hash方法为什么要做二次扰动?答案:key的hashCode大概率高位变化多、低位变化少,如果直接用低位做数组下标,很容易出现大量哈希冲突。二次扰动的作用:把高位的哈希信息打散到低位,让高低位特征都参与下标计算,大幅减少冲突概率。Java8扰动算法简化了,只做一次右移异或,兼顾性能和散列效果,比Java7的四次扰动更高效。7.HashMap初始化指定容量,底层实际容量是多少?答案:如果newHashMap(10),实际初始化容量是16。HashMap不会直接使用传入的容量,会自动计算出大于等于传入值的最小2的幂次。面试高频坑点:工作中预估数据量初始化HashMap,不能直接写预估数量,要写预估数量/0.75+1,避免频繁扩容。比如要存1000条数据,初始化容量设为1340左右最合适。三、并发安全问题(高频压轴)8.HashMap为什么线程不安全?具体会出现什么问题?答案:HashMap所有方法都没有加锁,并发场景下完全不安全,主要问题有3个:1)数据覆盖丢失:两个线程同时put同一个下标位置,后执行的线程会覆盖前一个线程的数据,导致数据丢失;2)Java7并发扩容死循环:头插法导致链表成环,后续get、put操作会无限循环,CPU飙高;Java8尾插法解决了死循环,但依然不安全;3)扩容数据丢失:多线程同时扩容,部分节点迁移失败,导致最终数据缺失。总结:Java8修复了死循环问题,但依然不保证线程安全,并发场景绝对不能用。9.并发场景下,HashMap有哪些替代方案?各自优缺点?答案:常用两种:Hashtable、ConcurrentHashMap,不推荐用Collections.synchronizedMap1)Hashtable优点:线程安全;缺点:所有方法加synchronized全局锁,独占锁,并发性能极差,基本被淘汰;不允许key、value为null。2)ConcurrentHashMap(推荐)Java7:分段锁,将数组分成多段,只锁当前操作的分段,并发度高;Java8:取消分段锁,采用CAS+synchronized锁链表头/树根节点,锁粒度更细,并发性能更强;支持高并发读写,是生产唯一推荐的并发Map。10.HashMap和ConcurrentHashMap的核心区别?答案:1)线程安全:HashMap不安全;ConcurrentHashMap线程安全;2)锁机制:HashMap无锁;JDK8ConcurrentHashMap用CAS+节点锁,只锁当前冲突位置,不锁整个数组;3)null值支持:HashMap允许一个key为null、多个value为null;ConcurrentHashMap不允许key和value为null,防止并发歧义;4)并发性能:ConcurrentHashMap支持高并发读写,HashMap并发会出问题。四、高频坑点与实操问题(面试加分项)11.HashMap为什么允许key为null?只能有一个nullkey?答案:HashMap对nullkey做了特殊处理,null的哈希值固定为0,所以会存入数组下标0的位置。因为key唯一,后续再putnullkey会直接覆盖旧值,所以只能存在一个nullkey。而ConcurrentHashMap禁止null,是因为并发场景下,无法区分是key不存在还是key为null,会产生业务歧义。12.equals和hashCode不重写会有什么问题?答案:如果自定义对象作为HashMap的key,不重写这两个方法,会出现内容相同的对象,无法覆盖、无法取出数据的bug。原理:1)默认hashCode是对象内存地址,两个内容相同的对象,哈希值不一样,会存在数组不同位置;2)默认equals比较的是内存地址,不是内容;最终结果:new一个相同内容的对象get,返回null,业务直接出错。规范:自定义对象当key,必须同时重写hashCode和equals。13.HashMap遍历过程中删除元素会报错吗?为什么?怎么正确删除?答案:普通for/增强for遍历中直接remove,会抛出ConcurrentModificationException并发修改异常。原因:HashMap有modCount修改计数器,遍历过程中会校验修改次数,发现遍历期间集合被修改,直接抛异常快速失败。正确删除方式:1)使用迭代器Iterator的remove方法;2)Java8+使用lambdaremoveIf方法,简洁高效,生产常用。14.说一下HashMap扩容全过程?答案:1)当元素数量>容量*0.75,触发扩容;2)新容量是原容量的2倍,新建更大的数组;3)遍历原数组所有节点,重新迁移:-链表节点:通过哈希&新容量,将原链表拆分为低位链表(原下标)和高位链表(原下标+原容量),分别放入新数组;-树节点:拆分后节点数量过少,退化为链表,否则保留红黑树结构;4)迁移完成后,替换新旧数组,完成扩容。Java8优化:不需要重新计算hash,只需要判断高位bit位,迁移效率远高于Java7。五、面试压轴简答(口头问答高频)1.HashMap有序吗?
答:无序,不保证插入顺序、不保证排序。有序Map:Li
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届南京市高三第二次模拟考试语文试卷含解析
- 2026广东江门市新会区人力资源和社会保障局“百万英才汇南粤”秋季招聘服务项目遴选笔试模拟试题及答案解析
- 招聘1人!拦隆口社区医院招聘乡村医生考试备考题库及答案解析
- 2026年合肥市怀宁路幼儿园招聘保育员1名笔试参考题库及答案解析
- 2026年宜黄县教师招聘笔试备考试题及答案解析
- 2026年全椒县教师招聘考试模拟试题及答案解析
- 2026年大化瑶族自治县教师招聘笔试备考题库及答案解析
- 2027上海市浦东新区进才森兰实验中学招聘初中教师考试备考题库及答案解析
- 2026惠州学院公开招聘教学法、课程与教学论师资3人考试备考试题及答案解析
- 2026年全南县教师招聘考试模拟试题及答案解析
- 大学形势与政策《国家发展战略》课堂讲授课件
- 新版2026年湖南物理卷高考真题(含答案)(网络参考)
- 2026届中国移动校园招聘笔试真题(含详细答案解析)
- 地下水污染阻隔墙建设技术
- 理发店消防责任制度
- 劳务公司上墙管理制度
- 25春国家开放大学《药剂学(本)》形考任务1-3参考答案
- 燃气维保合同协议
- 抖音房产直播敏感词汇表
- 当代社会问题课件
- GB T 197-2018 普通螺纹 公差(高清版)
评论
0/150
提交评论