版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaMap高频面试题及详细答案(真实面试版)一、基础认知类(初级必问)1、Java中Map是什么?有什么特点?和Collection区别?答案:Map是Java集合框架的双列集合接口,以键值对(key-value)的形式存储数据,每个键唯一,可对应一个值,值可以重复、可以为null。核心特点:双列存储,key唯一、value可重复key允许单个null,value允许多个null(HashMap)无序(HashMap)、有序(LinkedHashMap)、排序(TreeMap)不继承Collection接口,是独立的集合体系与Collection区别:Collection是单列集合,只存单个元素;Map是双列集合,存键值对Collection元素可重复;Map的key不可重复遍历方式不同,Map需先获取keySet、entrySet再遍历2、HashMap、TreeMap、LinkedHashMap、Hashtable区别?答案:集合有序性线程安全null支持底层结构适用场景HashMap无序不安全key、value均可null数组+链表+红黑树日常高频查询、增删LinkedHashMap插入有序/访问有序不安全key、value均可nullHashMap+双向链表需要保留插入顺序、LRU缓存TreeMapkey自然排序不安全value可null,key不可null红黑树需要根据key排序场景Hashtable无序安全(全局锁)key、value均不可null数组+链表老旧项目,基本淘汰3、Map的常用遍历方式有几种?各自优缺点?答案:四种常用遍历方式,工作中优先使用entrySet1、keySet遍历(先遍历key,再get获取value)缺点:两次遍历,先查key再查value,数据量大时效率低2、entrySet遍历(推荐)优点:一次性获取键值对,遍历效率最高,大数据量首选3、values遍历(只遍历value)优点:代码简洁;缺点:只能获取value,无法拿到key4、forEachLambda遍历(JDK8+)优点:代码极简;缺点:内部无法使用break、continue,复杂逻辑不适用二、HashMap核心原理(面试重中之重)4、HashMap底层数据结构?JDK1.7和JDK1.8区别?答案:JDK1.7底层:数组+单向链表所有哈希冲突的元素都挂在链表上,哈希冲突严重时,链表过长,查询效率退化为O(n)头插法插入数据,多线程扩容会出现链表循环死链问题JDK1.8底层:数组+单向链表+红黑树链表长度超过8且数组容量大于等于64时,链表转为红黑树,查询效率优化为O(logn)链表长度小于等于6时,红黑树退化为链表,减少树节点维护开销改为尾插法,避免多线程扩容死链问题优化哈希算法,减少哈希冲突概率5、HashMap默认容量、负载因子、扩容机制?答案:默认初始容量:16(必须是2的幂次,方便哈希取模运算)默认负载因子:0.75扩容阈值:容量*负载因子,16*0.75=12,元素数量超过12触发扩容扩容规则:每次扩容为原容量的2倍扩容过程:新建新数组,重新计算原数组元素的哈希位置,迁移元素,清空原数组负载因子0.75是时间和空间的平衡:负载因子过小,空间浪费大;过大,哈希冲突变多,查询效率降低。6、为什么HashMap容量必须是2的幂次?答案:为了优化取模运算。普通取模hash%length运算效率低,当容量为2的幂次时,hash&(length-1)等价于取模运算,位运算效率远高于取模运算。同时能保证哈希值分布均匀,减少冲突。如果容量不是2的幂次,length-1会出现二进制0位,导致部分数组下标永远无法存储元素,造成空间浪费。7、HashMap哈希冲突怎么解决?答案:采用链地址法(拉链法)解决哈希冲突1、计算key的哈希值,定位数组下标;2、如果该下标位置无元素,直接存入数组;3、如果已有元素,产生哈希冲突,挂载到该位置的链表尾部;4、当链表长度超过8且数组容量≥64,链表转红黑树,提升查询效率;5、扩容时重新哈希,分散冲突元素。8、链表转红黑树、红黑树退链表的阈值?为什么是8和6?答案:链表转红黑树:链表长度>8+数组容量≥64红黑树退链表:节点数≤6原因:根据源码统计,哈希均匀情况下,链表长度达到8的概率极低,属于极端哈希冲突场景。树结构节点占用内存比链表大,短链表用链表遍历更快,无需转树。设置6和8的差值,是为了防止频繁转换,避免元素增减时反复树化、退化,造成性能抖动。9、HashMap的put流程详细说一下(JDK1.8)答案:判断数组是否为空或长度为0,为空则先初始化数组(默认容量16);根据key计算哈希值,通过hash&(len-1)算出数组下标;判断下标位置是否为空,为空直接新建节点存入;如果位置不为空,判断首节点key是否和当前key一致,一致则覆盖value;判断当前节点是否是树节点,如果是红黑树节点,执行树的插入逻辑;如果是链表,遍历链表,找到key相同节点则覆盖value,遍历到尾部无重复则尾插;插入完成后,判断链表长度是否超过8,满足条件则树化;判断元素总数是否超过扩容阈值,超过则执行扩容;返回旧的value值。10、HashMap为什么线程不安全?会出现什么问题?答案:HashMap所有操作无锁,多线程并发场景下线程不安全,主要问题:数据覆盖:多线程同时put同一个下标位置的元素,后插入的元素会覆盖先插入的,导致数据丢失;JDK1.7扩容死链:头插法导致多线程扩容时链表形成环形结构,get元素时死循环,CPU爆满;元素丢失:并发扩容、并发插入都会导致部分元素迁移失败、数据丢失;JDK1.8解决了死链问题,但依然存在数据覆盖、数据丢失,线程依旧不安全。三、并发Map相关面试题11、ConcurrentHashMap原理?如何保证线程安全?答案:ConcurrentHashMap是线程安全的Map,用于替代Hashtable,并发性能远优于Hashtable。JDK1.7分段锁:将容器分为16个Segment分段,每个分段独立加锁,不同分段可并发操作,大幅提升并发量;JDK1.8CAS+synchronized锁:摒弃分段锁,采用数组+链表+红黑树结构。锁机制:空位置插入:使用CAS无锁操作,无阻塞;已有元素位置:对数组首节点加synchronized锁,只锁当前下标位置,不影响其他位置并发读写;配合volatile保证数组、节点的可见性,禁止指令重排。优势:锁粒度极小,并发效率极高,支持多线程同时读写不同下标数据。12、ConcurrentHashMap和Hashtable区别?答案:锁粒度不同:Hashtable是全局synchronized锁,所有线程互斥,并发极低;ConcurrentHashMap锁单个桶节点,并发性能高;null支持:两者key、value均不允许为null;迭代器:Hashtable迭代器是fail-fast;ConcurrentHashMap是弱一致性迭代器,遍历期间允许修改,不会抛异常;底层结构:Hashtable数组+链表;JDK1.8ConcurrentHashMap数组+链表+红黑树。四、高频坑点&进阶面试题13、HashMap的key为什么必须重写equals和hashCode?只重写一个会怎么样?答案:HashMap判断key重复的规则:先比hashCode,再比equals。1、只重写hashCode,不重写equals:两个内容相同的对象,hashCode一致,但equals默认比较地址,会判定为不同key,导致Map中存入重复数据,无法去重。2、只重写equals,不重写hashCode:内容相同的对象,hashCode不同,会被存入数组不同下标位置,明明是相同key却无法覆盖,造成数据冗余、查询不到数据。结论:自定义对象作为Map的key,必须同时重写hashCode和equals方法。14、HashMap允许key为null吗?为什么只有一个nullkey?答案:HashMap允许key为null,且只能存在一个nullkey。源码中key为null时,哈希值固定为0,固定存入数组下标0的位置。后续再存入nullkey时,会触发key重复覆盖逻辑,所以只能保留一个nullkey。TreeMap、Hashtable不允许key为null,会直接抛出空指针异常。15、LinkedHashMap如何实现LRU缓存?答案:LinkedHashMap自带双向链表,默认支持插入有序,开启访问有序后可实现LRU(最近最少使用)缓存。构造方法传入accessOrder=true,每次get、put访问元素后,会将当前元素移动到链表尾部,链表头部就是最久未使用的元素。重写removeEldestEntry方法,设定缓存最大容量,超出容量时自动删除头部最久未使用元素,即可实现简易LRU缓存。16、TreeMap排序规则?key可以为null吗?答案:TreeMap基于红黑树实现,根据key排序,有两种排序方式:自然排序:key实现Comparable接口,重写compareTo方法;定制排序:创建TreeMap时传入Comparator比较器。TreeMapkey不允许为null,因为排序需要比较key,null无法比较,会抛出空指针异常;value可以为null。17、fail-fast和fail-safe区别?答案:fail-fast(快速失败):HashMap、ArrayList
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陕西省宝鸡岐山县联考2027届八年级数学第一学期期末教学质量检测模拟试题含解析
- 2026年北京市建筑工程施工现场安全管理规范试题及答案
- 2026年山东省济南市外国语学校九年级化学下册溶液知识点巩固习题及答案
- 2026中国智能眼镜行业市场竞争格局快速扩张投资前景规划分析
- 化脓性汗腺炎的护理查房
- 精神异常患者的护理
- 2026云计算服务市场规模分析及竞争格局与战略投资研究报告
- 偏瘫卧床的康复护理
- 2026自航式移动平台制造业市场需求开拓与发展规划分析研究报告
- 2026组件制造业产业链布局影响评价调度系统配置技术标准生态环保评估
- 野村-中国:中国人民银行对人民币及全球失衡的立场-China:The P BoCs stance on RMB and global imbalances-20261008
- 2026年企业文化企业建设知识竞赛-中国电信知识竞赛历年参考题库含答案解析
- ESG管理制度手册
- 开学思政第一课2026年秋季学期开学典礼校长致辞
- 2026苏教版二上数学第二单元第5课时《用1~6的乘法口诀求商》课件
- 2026年广东省检察官逐级遴选笔试题目及答案
- 2026年贵州中考(数学)考试试卷(真题)答案解析
- 校园小导游、小讲堂(课件)-2025-2026学年人教版二年级上册数学
- 《演唱 郊游》课件2025-2026学年冀少版三年级下册音乐
- 矿山全员责任制考核制度
- 2026年乡村医生真题【历年真题】附答案详解
评论
0/150
提交评论