版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java集合类高频面试题及详细答案(实战版)一、基础概念类1.Java集合框架的整体结构是什么?分为哪两大派系?Java集合主要分为Collection(单列集合)和Map(双列集合)两大核心派系,所有集合工具都基于这两个顶层接口延伸。1.Collection单列集合:存储单个元素,核心子接口:List:有序、可重复、有索引,常用实现类:ArrayList、LinkedList、VectorSet:无序、不可重复、无索引,常用实现类:HashSet、LinkedHashSet、TreeSetQueue:队列集合,遵循先进先出,常用实现类:ArrayDeque、LinkedList2.Map双列集合:存储键值对(key-value),key唯一、value可重复,常用实现类:HashMap、LinkedHashMap、TreeMap、Hashtable2.Collection和Collections的区别?二者名称相似但完全不同,是面试高频基础考点:Collection:是Java集合的顶层接口,定义了单列集合的通用方法(add、remove、size、clear等),是所有List、Set、Queue的父接口。Collections:是一个工具类,属于java.util包,包含大量静态方法,用于操作集合(排序、打乱、同步、空集合创建等),比如Collections.sort()、Collections.synchronizedList()。3.数组和集合的区别?长度特性:数组长度固定,初始化后无法修改;集合长度可变,支持动态扩容、缩容。存储类型:数组可存储基本数据类型和引用类型;集合只能存储引用类型(基本类型会自动装箱为包装类)。功能方法:数组仅有length属性,无内置操作方法;集合封装了增删改查、排序、遍历、判断等丰富方法,开发效率更高。泛型支持:数组不支持泛型,存在类型不安全问题;集合支持泛型,编译阶段即可校验类型,避免类型转换异常。二、List集合高频考点1.ArrayList和LinkedList的区别?实际开发怎么选择?核心区别基于底层数据结构,直接决定使用场景:底层结构ArrayList底层是动态数组;LinkedList底层是双向链表。性能差异查询/修改:ArrayList效率极高,数组支持随机访问,通过索引直接定位元素;LinkedList必须从头/尾遍历,查询效率低。增删操作:首尾增删时LinkedList效率高,仅需修改节点指针;ArrayList增删中间元素需要移动大量元素,效率低。尾部新增元素二者效率差距极小。内存占用ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点包含数据和前后指针,单个元素占用内存更大。使用场景优先用ArrayList:绝大多数场景,查询多、增删少(业务开发90%场景)优先用LinkedList:频繁在集合首尾做增删操作,极少查询的场景2.ArrayList的扩容机制?默认初始容量、扩容倍数是多少?JDK1.8及以上版本ArrayList扩容机制(主流面试版本):默认初始容量:空参构造创建的ArrayList,初始为空数组,首次添加元素时才初始化容量为10,实现懒加载,节省内存。扩容触发条件:当集合元素个数size等于数组容量时,触发扩容。扩容倍数:每次扩容为原容量的1.5倍(通过位运算实现:oldCapacity+(oldCapacity>>1))。扩容流程:创建新数组→复制原数组所有元素到新数组→替换原数组引用。补充:JDK1.7及之前空参构造直接初始化容量10,无懒加载机制。3.ArrayList、Vector的区别?Vector为什么被淘汰?线程安全:ArrayList非线程安全;Vector所有增删改查方法都加了synchronized,线程安全。扩容机制:ArrayList扩容1.5倍;Vector默认扩容2倍。效率:Vector同步锁导致并发场景下效率极低,吞吐量差。Vector被淘汰核心原因:锁粒度太大,所有方法串行执行,性能极差。实际并发场景不会用Vector,而是用CopyOnWriteArrayList。三、Set集合高频考点1.HashSet去重原理?为什么重写equals必须重写hashCode?HashSet去重原理HashSet底层基于HashMap实现,添加元素时,先调用对象的hashCode()计算哈希值,确定存储位置:若该位置无元素:直接存入元素;若该位置已有元素:调用equals()对比两个对象内容;equals返回true:判定为重复元素,不存入;返回false:发生哈希冲突,链式挂载存入。重写equals必须重写hashCode的原因如果只重写equals不重写hashCode,会出现内容相同的对象,哈希值不同的问题,导致HashSet无法去重,重复元素可以正常存入集合,违背Set去重特性。规范:两个对象equals相等,哈希值必须相等;哈希值相等,对象不一定相等。2.HashSet、LinkedHashSet、TreeSet的区别?HashSet:底层HashMap,无序、无排序,查询存取效率最高,日常去重首选。LinkedHashSet:底层LinkedHashMap,保留插入顺序,基于哈希表+双向链表实现,性能略低于HashSet。适用于需要去重且保留存入顺序的场景。TreeSet:底层TreeMap,自然排序/自定义排序,默认按照元素字典序排序,可通过比较器自定义排序。缺点是增删查效率低于HashSet。四、Map集合核心高频考点(面试重点)1.HashMap的底层原理?JDK1.8做了哪些优化?底层原理HashMap底层是数组+链表+红黑树的复合结构,基于哈希算法实现键值对存储:通过key的hashCode计算哈希值,定位数组下标;下标位置无数据,直接存入;下标位置有数据,通过equals对比key,key相同则覆盖value,key不同则形成链表;当链表长度≥8且数组容量≥64时,链表转换为红黑树,提升查询效率;当链表长度≤6时,红黑树退化为链表。JDK1.8核心优化数据结构优化:由单纯的数组+链表,升级为数组+链表+红黑树,解决哈希冲突严重时链表过长、查询效率极低的问题;扩容优化:优化了哈希重算逻辑,减少元素迁移次数;插入方式优化:链表由头插法改为尾插法,彻底解决JDK1.7扩容死循环问题;初始化优化:懒加载机制,首次put元素才初始化数组,节省内存。2.HashMap默认参数?初始容量、负载因子、树化阈值默认初始容量:16(必须是2的幂次方,方便哈希取模运算)默认负载因子:0.75扩容阈值:容量*负载因子=12,元素数量达到12时触发扩容,扩容为原容量2倍树化阈值:链表长度≥8,且数组容量≥64,链表转红黑树树退化阈值:链表长度≤6,红黑树退化为链表负载因子0.75是时间和空间的平衡值:过低浪费空间,过高哈希冲突变多、效率下降。3.HashMap和Hashtable的区别?线程安全:HashMap非线程安全;Hashtable方法加synchronized,线程安全。null支持:HashMap允许一个null键、多个null值;Hashtable不允许null键和null值,直接报错空指针。扩容机制:HashMap扩容2倍;Hashtable扩容2倍+1。效率:HashMap无锁,效率高;Hashtable锁粒度大,效率极低,基本废弃。补充:并发场景不使用Hashtable,优先使用ConcurrentHashMap。4.HashMap和LinkedHashMap、TreeMap的区别?HashMap:存取无序,性能最优,日常开发最常用。LinkedHashMap:继承HashMap,底层额外维护双向链表,保留插入顺序,可实现LRU缓存策略。TreeMap:底层红黑树,按键默认自然排序,支持自定义比较器排序,增删查效率低于HashMap。五、并发集合高频考点1.ConcurrentHashMap的原理?JDK1.7和1.8区别ConcurrentHashMap是并发场景下的高效键值集合,线程安全、效率远高于Hashtable。JDK1.7实现采用分段锁(Segment)机制,将数组分为16个分段,每个分段独立加锁,不同分段可并发操作,降低锁竞争。缺点是分段锁粒度依然偏大。JDK1.8实现(主流)放弃分段锁,采用CAS+synchronized实现并发控制,锁粒度细化到数组单个节点:无冲突时通过CAS无锁操作,效率极高;发生哈希冲突时,对当前数组节点加synchronized锁;底层同样是数组+链表+红黑树,大幅提升并发吞吐量。2.CopyOnWriteArrayList原理及使用场景?CopyOnWriteArrayList是线程安全的List集合,核心原理:写时复制。读操作:无锁,直接读取原数组数据,效率极高;写操作(增删改):加锁,先复制原数组生成新数组,在新数组上完成修改,最后替换原数组引用;数据一致性:读写分离,读的是旧数组数据,属于弱一致性,不保证实时最新。使用场景:读多写少的并发场景(配置缓存、白名单、常量列表),不适合频繁写操作,因为每次写都会复制数组,内存开销大。六、集合常见坑点与面试实操题1.迭代器遍历集合时,为什么不能直接增删元素?怎么解决?普通for/增强for遍历集合时,直接调用集合add/remove方法,会触发ConcurrentModificationException(并发修改异常)。原因:集合维护modCount(修改次数)和expectedModCount(预期修改次数),遍历过程中增删会修改modCount,二者不相等,抛出异常。解决方案:使用迭代器自带的remove/add方法,会同步更新expectedModCount,不会报错;JDK8+使用stream过滤删除;遍历前拷贝集合,遍历拷贝集合,操作原集合。2.HashMap为什么不允许key为可变对象?如果key是自定义可变对象,修改对象属性后,hashCode会发生变化,导致后续无法通过get方法获取到该键值对,造成数据丢失、内存泄漏。开发规
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026天津市高职院校面向中职分类招生考试(文化素质)历年参考题库含答案详解
- 2026年水运工程试验检测师资格考试(水运材料)经典试题及答案二
- 市政工程安全生产责任制管理制度
- 智能消防探测报警器线建设项目可行性研究报告
- 医院医务人员个人防护用品管理规范
- 源网荷储系统技术方案
- 中空玻璃材料检验与试验方案
- 液流电池长时储能项目可行性研究报告
- 新生儿病区感染预防控制规范
- 桥梁横隔梁施工方案
- 2026年血液疾病试题及答案解析
- 2026年春招找考试模拟题及答案详解
- 高校安全考核奖惩管理制度
- 2026年威海市专业技术人员公需课考试题及答案
- 装修工程报价单模板-含主材辅材人工分项明细
- 《小小歌唱家 巴加女孩+音乐跨大洋》课件2026-2027学年人教版五年级上册音乐
- 大型粮仓工程监理大纲
- 二年级(上)语文 1-8单元一课一练
- 2026年7月典型事故案例警示教育培训
- 高考英语词汇3500词精校版-顺序版
- 微信小程序申请模板-电商平台对用户交易纠纷处理的机制或方案
评论
0/150
提交评论