版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java集合高频面试题及详细答案(实战干货版)一、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.集合和数组的区别?这是入门必问基础题,核心区别集中在长度、存储类型、功能特性:长度不同:数组长度固定,初始化后无法修改;集合长度可变,自动扩容、缩容存储类型不同:数组可以存储基本数据类型和引用类型;集合只能存储引用类型(基本类型会自动装箱)功能不同:数组方法单一,只有基础取值、赋值;集合封装了增删改查、遍历、排序、去重等丰富方法泛型支持:集合支持泛型,编译期校验类型,避免类型转换异常;数组无泛型,存在类型不安全问题3.什么是泛型?为什么集合必须用泛型?泛型是一种类型参数化机制,简单说就是在定义集合、方法、类时,不指定具体数据类型,在使用时再确定类型。使用泛型的核心目的:编译期约束集合存储类型,防止存入非法数据取消强制类型转换,减少运行时类型转换异常提升代码复用性,一套集合代码可适配多种数据类型如果不使用泛型,集合默认存储Object类型,取出元素必须强转,极易出现ClassCastException。二、List集合高频面试题1.ArrayList和LinkedList的区别?(最核心面试题)两者都是List接口实现,有序可重复,核心差异在底层结构、读写效率、内存占用:底层结构:ArrayList基于动态数组;LinkedList基于双向链表查询效率:ArrayList随机访问快(通过索引直接定位,时间复杂度O(1));LinkedList随机查询慢(需要从头遍历,O(n))增删效率:首尾增删数据,LinkedList更快(只需修改节点指针,无需移动元素);中间位置增删,两者都慢;ArrayList增删需要移动数组元素,大量数据下效率低内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点存储数据+前后指针,单个元素内存占用更高使用场景:查询多、增删少用ArrayList;频繁首尾增删、极少查询用LinkedList2.ArrayList的默认初始容量、扩容机制?JDK1.8及以上版本核心机制:默认空参构造创建的ArrayList,初始是空数组,不会初始化容量,首次添加元素时才初始化容量为10扩容规则:当数组元素满了之后,触发扩容,新容量=原容量+原容量/2,也就是1.5倍扩容扩容过程:创建新数组→复制原数组所有元素到新数组→替换原数组,底层依靠Arrays.copyOf()实现补充:JDK1.7及之前空参构造直接初始化容量10,1.8优化为延迟初始化,节省内存。3.ArrayList、Vector的区别?线程安全:ArrayList非线程安全;Vector所有方法都加了synchronized,线程安全扩容机制:ArrayList1.5倍扩容;Vector默认2倍扩容,可手动指定扩容增量效率:Vector加锁导致并发效率极低,日常开发几乎不用;ArrayList无锁,性能优异总结:多线程环境下不推荐Vector,优先使用CopyOnWriteArrayList。4.为什么ArrayList是非线程安全的?并发场景会出现什么问题?ArrayList的增删改查方法没有加锁,多线程并发添加元素时,会出现两个核心问题:元素覆盖:两个线程同时获取数组末尾索引,同时赋值,会导致其中一个线程的赋值操作被覆盖,元素丢失数组越界异常:多个线程同时判断容量,都认为无需扩容,同时添加元素,超出数组最大容量,抛出ArrayIndexOutOfBoundsException并发替代方案:CopyOnWriteArrayList(写时复制,适合读多写少场景)。三、Set集合高频面试题1.HashSet、LinkedHashSet、TreeSet的区别?HashSet:底层基于HashMap,无序、去重,查询、存储效率极高,日常去重首选LinkedHashSet:继承HashSet,底层基于LinkedHashMap,保留插入顺序、可去重,性能略低于HashSetTreeSet:底层基于TreeMap,自然排序/自定义排序、可去重,无序(不保留插入顺序),适合需要自动排序的场景2.HashSet去重原理?为什么必须重写equals和hashCode方法?HashSet存储元素的底层逻辑(JDK1.8):调用对象的hashCode()方法计算哈希值,通过哈希算法算出数组存储位置如果该位置无元素,直接存入;如果有元素,执行下一步对比哈希值,若哈希值不同,直接判定为不同元素,存入集合若哈希值相同,调用equals()方法比对内容,返回true则判定为重复元素,不存储;返回false则存入(形成哈希冲突)必须重写两个方法的原因:只重写hashCode:不同对象可能哈希值相同,equals不重写会认为是不同对象,无法去重只重写equals:默认hashCode返回对象地址,内容相同的不同对象哈希值不同,依然无法去重3.TreeSet排序规则?自然排序和比较器排序区别?TreeSet基于红黑树实现,元素必须具备排序规则,否则抛出类型转换异常。自然排序:元素类实现Comparable接口,重写compareTo方法,定义默认排序规则(如String、Integer默认实现)比较器排序:创建TreeSet时传入Comparator比较器对象,重写compare方法,属于临时排序规则,优先级高于自然排序四、Map集合高频面试题(重点)1.HashMap的底层原理?JDK1.7和JDK1.8的核心区别?HashMap是开发最常用的键值对集合,非线程安全、key唯一、允许null键null值,底层是「数组+链表+红黑树」的哈希表结构(JDK1.8)。JDK1.7底层结构:数组+单向链表,链表过长会一直遍历,查询效率极低;采用头插法添加链表节点。JDK1.8核心优化:结构升级:数组+链表+红黑树,解决链表过长查询慢的问题树化规则:链表长度超过8,且数组容量大于64,链表转为红黑树;链表长度小于6,红黑树退化为链表插入方式:改为尾插法,彻底解决1.7头插法导致的循环链表死循环问题优化哈希算法,减少哈希冲突概率2.HashMap默认参数、扩容机制?默认初始容量:16,默认加载因子:0.75阈值(扩容临界值)=容量×加载因子=12扩容规则:元素数量超过阈值时,触发2倍扩容,容量始终为2的幂次方加载因子0.75的设计原因:平衡哈希冲突概率和内存利用率,0.75是官方测试的最优值,过小浪费内存,过大冲突过多、效率下降。3.HashMap为什么线程不安全?并发会出现什么问题?HashMap所有操作无锁,并发场景下存在严重线程安全问题:数据覆盖丢失:多线程同时put元素,哈希位置相同,后写入的数据会覆盖先写入的数据循环链表死循环(JDK1.7):头插法+并发扩容,会导致链表节点循环引用,get操作时死循环,CPU飙高统计数据不准确:size计数未加锁,并发新增元素导致size统计偏小并发替代:ConcurrentHashMap(线程安全、高性能)。4.HashMap、LinkedHashMap、TreeMap、Hashtable区别?HashMap:无序、非线程安全、允许null键值,底层数组+链表+红黑树,性能最高,日常开发首选LinkedHashMap:继承HashMap,保留插入顺序,可实现LRU缓存策略,性能略低于HashMapTreeMap:基于红黑树,按键排序,非线程安全,适合需要有序存储的场景Hashtable:线程安全(全表锁)、不允许null键值、效率极低,基本被淘汰5.ConcurrentHashMap底层原理?为什么比Hashtable高效?ConcurrentHashMap是并发场景专用的线程安全Map,JDK1.8做了大幅优化:底层结构:数组+链表+红黑树,和HashMap一致加锁方式:放弃Hashtable的全局synchronized锁,采用CAS+synchronized分段锁,只锁定当前哈希桶节点,不影响其他桶的读写并发效率:支持多线程同时操作不同哈希位置的元素,并发度极高;Hashtable全局锁,同一时间只有一个线程能操作补充:JDK1.7采用分段Segment锁,1.8取消分段锁,优化为节点锁,并发性能更强。五、集合遍历与常见坑点面试题1.集合有几种遍历方式?各自适用场景?普通for循环:支持索引,可遍历、可修改元素,适合List集合增强for循环(foreach):写法简洁,适合快速遍历,遍历中不能增删元素,否则报并发修改异常迭代器Iterator:支持遍历过程中安全删除元素,所有集合通用Stream流式遍历:JDK8+,支持遍历、筛选、排序、聚合等链式操作,代码简洁高效2.什么是并发修改异常(ConcurrentModificationException)?产生原因和解决方式?产生原因:使用增强for循环或普通遍历集合时,主线程修改集合结构(增删元素),集合的修改次数和预期次数不匹配,触发异常。解决方式:使用迭代器Iterator的remove方法删除元素(安全修改)遍历前复制集合,遍历副本、修改原集合使用并发安全集合:CopyOnWriteArrayList、ConcurrentHashMap3.说说CopyOnWriteArrayList的原理和适用场景?核心原理:写时复制。所有修改操作(增删改)不会直接修改原数组,而是复制一份新数组,在新数组上修改,修改完成后替换原数组;读操作直接读取原数组,无锁。优点:读操作完全无锁,并发读取效率极高,线程安全缺点:写操作需要复制数组,内存开销大、写效率低;存在数据弱一致性,读取到的是旧数据适用场景:读多写少的并发场景,如配置缓存、静态数据列表六、高频对比压轴题1.HashMap和ConcurrentHashMap的区别?线程安全:HashMap非线程安全;ConcurrentHashMap线程安全加锁机制:HashMap无锁;ConcurrentHashMapCAS+节点锁
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中小学生航空航天科普知识竞赛真题试卷(+答案)
- 2025年中医学题库及答案大全
- 2025年注册营养师技师试题库(含答案解析)
- 2025全国安全知识竞赛题库(含答案)
- 2025一级消防工程师继续教育考试题库及答案
- 2025中医技术培训试卷
- 2026年《药物临床试验质量管理规范》试题附答案
- 2026年大学生国家安全知识试题库(含答案)
- 肛门括约肌松弛疾病防治指南解读
- 阿替普酶急诊静脉溶栓治疗超早期急性脑梗死20例临床分析
- 矿产资源储量报告编制和评审中常见问题及其处理意见
- 师德师风专题讲座主题课件
- 二手房买卖合同范本下载可打印
- 《西式烹饪工艺》课件-炸薯条
- 工业设计专业职业生涯规划
- 工业设计技术-Geomagic Design X 逆向设计实用教程 课件 项目5、6 遥控器建模、连杆建模
- 桥梁现浇箱梁模板支架验收记录表
- 第九章分类系统与进化谱系
- 九年级上册反比例函数作业设计
- GB/T 36129-2018珠宝玉石鉴定阴极发光图像法
- GB/T 13452.2-2008色漆和清漆漆膜厚度的测定
评论
0/150
提交评论