版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java集合框架高频面试题及详细答案(真实面试版)一、基础概念类(入门必问)1.说说Java集合的整体架构?Collection和Map的区别?Java集合主要分为两大核心体系:Collection单列集合和Map双列集合,所有集合都在java.util包下,整体架构清晰。Collection是单列集合顶级接口,存储单个元素,主要分为三大子类:List:有序、可重复、有索引,代表实现:ArrayList、LinkedList、VectorSet:无序、不可重复、无索引,代表实现:HashSet、LinkedHashSet、TreeSetQueue:队列集合,先进先出,代表实现:ArrayDeque、LinkedListMap是双列集合顶级接口,存储键值对(key-value),key唯一不可重复,value可重复,代表实现:HashMap、LinkedHashMap、TreeMap、HashTable。核心区别:Collection存单个元素,Map存键值对;Collection元素直接存取,Map通过key映射获取value。2.List、Set、Queue三者的核心区别?List:有序(存入顺序和取出顺序一致)、可重复、支持下标索引,能精准根据位置增删查改Set:无序(部分实现有序)、元素唯一不可重复、无索引,不能通过下标获取元素,主要用于去重场景Queue:队列结构,遵循先进先出原则,主要用于任务排队、缓冲场景,不支持随机访问3.数组和ArrayList的区别?这是面试高频基础题,核心区别有5点:长度特性:数组长度固定,初始化后无法修改;ArrayList是动态扩容,长度自动变化存储类型:数组可存基本类型+引用类型;ArrayList只能存引用类型,基本类型会自动装箱默认值:数组初始化有默认值(int为0、对象为null);ArrayList默认空,无默认值方法支持:数组只有少数自带方法,功能单一;ArrayList封装了增删改查、遍历、排序等丰富方法内存占用:数组内存紧凑、效率更高;ArrayList有扩容冗余空间,内存利用率稍低二、List集合高频考点1.ArrayList和LinkedList的区别?适用场景?底层结构:ArrayList基于动态数组;LinkedList基于双向链表。查询效率:ArrayList支持随机访问,通过下标直接定位元素,查询速度极快;LinkedList必须从头节点遍历查找,查询效率低。增删效率:ArrayList中间/头部增删需要移动大量元素,效率低;尾部增删效率高;LinkedList只需要修改节点指针,任意位置增删效率都很高。内存消耗:ArrayList有扩容预留空间,存在内存冗余;LinkedList每个节点存数据+前后指针,单个元素内存占用更大。线程安全:两者都是非线程安全。适用场景:
ArrayList:查询多、增删少(绝大多数业务场景);
LinkedList:频繁中间/头部增删、查询极少的场景。2.ArrayList的扩容机制?(核心源码考点)JDK1.8及以上的ArrayList扩容流程,面试标准回答:无参构造初始化时,先创建空数组,默认初始容量0,第一次添加元素时,自动初始化容量为10;当数组元素个数达到当前容量,触发扩容;扩容规则:默认扩容为原容量的1.5倍(原容量+原容量/2);扩容底层通过Arrays.copyOf()实现,创建新数组,复制旧数组所有元素,丢弃旧数组;如果一次性添加大量元素,1.5倍扩容不够,会直接扩容到所需最小容量,避免多次扩容。补充:JDK1.7及之前无参构造直接初始化10容量数组,1.8优化为懒加载,节省内存。3.为什么ArrayList不适合频繁扩容?怎么优化?因为每次扩容都需要创建新数组、复制元素、废弃旧数组,会产生大量GC开销,频繁扩容严重影响性能。优化方案:提前预估数据量,使用有参构造newArrayList(预估容量)初始化,避免运行中频繁扩容。三、Set集合高频考点1.HashSet底层原理?怎么保证元素不重复?HashSet底层本质就是HashMap,HashSet的add方法,本质是调用HashMap的put方法,存入的元素作为HashMap的key,value是固定的空对象。去重原理(两步校验):先调用对象的hashCode()方法计算哈希值,确定数组存储位置;如果该位置没有元素,直接存入;如果有元素,再调用equals()方法对比内容;hashCode不同:直接存入;hashCode相同、equals不同:发生哈希冲突,链式存储;hashCode和equals都相同:判定为重复元素,拒绝存入。重点:自定义对象存入HashSet,必须重写hashCode()和equals(),否则会出现去重失效问题。2.HashSet、LinkedHashSet、TreeSet的区别?HashSet:底层HashMap,无序、不重复,查询存取速度快,日常去重首选LinkedHashSet:继承HashSet,底层LinkedHashMap,有序(存入顺序)、不重复,性能比HashSet稍低TreeSet:底层TreeMap,自然排序(升序)、不重复,支持自定义比较器,适合需要排序的去重场景3.为什么重写equals必须重写hashCode?如果只重写equals不重写hashCode,会出现内容相同但哈希值不同的情况。两个内容完全一样的对象,equals比对返回true,但hashCode不同,HashSet/HashMap会判定为两个不同对象,导致去重失效、重复存储,违反集合唯一性规则。核心约定:equals相等的对象,hashCode必须相等;hashCode相等,equals不一定相等。四、Map集合核心高频(面试重中之重)1.HashMap底层结构?JDK1.7和1.8的区别?底层结构:HashMap是数组+链表+红黑树的复合结构(JDK1.8)。JDK1.7vsJDK1.8核心区别:数据结构:1.7只有数组+链表;1.8新增红黑树,链表长度超过阈值转为红黑树插入方式:1.7链表头插法;1.8链表尾插法,解决了并发死循环问题扩容时机:1.7先扩容再插入;1.8先插入再扩容树化阈值:1.8链表长度≥8且数组容量≥64,转为红黑树;链表长度≤6,退化为链表哈希算法:1.8简化哈希扰动算法,效率更高2.HashMap的默认参数、扩容、树化规则?默认参数:默认初始容量:16默认负载因子:0.75扩容阈值:容量×负载因子(16×0.75=12),元素数量超过12触发扩容树化阈值:链表长度8,数组容量64树退化阈值:链表长度6扩容规则:每次扩容为原容量2倍,且容量永远是2的幂次,目的是优化哈希取模运算,提升寻址效率。3.为什么负载因子是0.75,不是0.5或1?负载因子是平衡空间利用率和查询效率的关键:如果是0.5:扩容太频繁,空间利用率低,浪费内存如果是1:填满再扩容,哈希冲突概率极高,链表过长,查询效率暴跌0.75是官方测算的最优值,完美平衡内存占用和查询性能4.HashMap为什么线程不安全?会出现什么问题?HashMap所有方法都没有加锁,并发场景下线程不安全,核心问题:JDK1.7:并发扩容会出现链表死循环,导致CPU100%占用,同时会出现数据覆盖、丢失JDK1.8:修复了死循环问题,但依然会出现数据覆盖、元素丢失,并发put操作会互相覆盖并发场景推荐使用:ConcurrentHashMap。5.HashMap、HashTable、ConcurrentHashMap区别?HashMap:非线程安全,key、value均可为null,效率最高,单线程首选HashTable:线程安全,所有方法加synchronized锁,效率极低,key、value不能为null,基本废弃ConcurrentHashMap:线程安全,分段锁机制(1.7分段锁、1.8CAS+synchronized),高并发高效,多线程首选6.ConcurrentHashMap1.7和1.8的区别?锁机制:1.7分段Segment锁,锁粒度大;1.8取消分段锁,采用CAS+synchronized,只锁当前链表头/树节点,锁粒度极小数据结构:1.7数组+链表;1.8数组+链表+红黑树并发度:1.7默认并发度16;1.8并发度随容量动态变化,并发性能大幅提升7.LinkedHashMap有序原理?怎么实现LRU缓存?LinkedHashMap底层在HashMap基础上,维护了一条双向链表,记录元素存入顺序,所以能保证有序。它有一个构造参数accessOrder,默认false(插入有序);设置为true时,开启访问有序,每次访问元素都会将元素移到链表尾部。重写removeEldestEntry方法,限定最大缓存数量,超出后自动删除最久未访问的头部元素,即可简单实现LRU缓存淘汰策略。五、集合通用面试考点1.迭代器Iterator的原理?为什么迭代时不能用集合自带方法增删元素?Iterator是集合专用迭代工具,基于游标遍历,不依赖集合下标。迭代过程中,集合会维护一个modCount修改计数器,每次增删都会让modCount++;迭代器初始化时会记录expectedModCount。如果迭代中用集合add/remove,modCount和expectedModCount不一致,直接抛出ConcurrentModificationException并发修改异常。解决方案:使用迭代器自带的remove方法,不会修改modCount,避免异常。2.快速失败(fail-fast)和安全失败(fail-safe)区别?快速失败(fail-fast):ArrayList、HashMap等普通集合迭代器机制,遍历中检测到集合修改,直接抛异常,防止脏数据,是并发不安全的。安全失败(fail-safe):ConcurrentHashMap、CopyOnWriteArrayList并发集合机制,遍历的是集合的快照副本,原集合修改不会影响遍历,不会抛异常,适合并发场景,缺点是遍历数据不是实时最新的。3.CopyOnWriteArrayList原理及适用场景?底层原理:写时复制。增删改操作时,先复制一份新数组,在新数组上修改,修改完成后替换原数组;读操作直接读原数组,无锁。特点:读写分离,读不加锁、写加锁,读性能极高,写性能差,会产生内存副本。适用场景:读多写少的并发场景,比如配置缓存、白名单列表。不适合大量写入场景,会频繁复制数组、浪费内存。4.TreeMap和HashMap区别?底层结构:HashMap数组+链表+红黑树;TreeMap纯红黑树有序性:HashMap无序;TreeMap按键自然排序/自定义排序查询效率:HashMapO(1);TreeMapO(logn)key要求:HashMapkey可null;TreeMapkey不能为null,必须实现Comparable接口或指定比较器六、面试压轴简答(高频口述题)1.工作中怎么选择集合?给一套面试直接能用的选型逻辑:只存元素、有序可重复、查询多:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中储粮储运有限公司招聘(57人)笔试历年参考题库附带答案详解
- 2025年中级审计师考试试题及答案
- 2025年中小学生科学知识竞赛试题及答案
- 2025年注册安全工程师考试真题(含答案)大全
- 2025年注册营养师资格考试试题及答案
- 2025全国不动产登记代理人《不动产登记代理实务》考试真题附完整解
- 2025一级消防工程师综合能力真题及答案解析
- 2025中医考试题及答案大全
- 2026年二级建造师建筑工程模拟试题库及答案
- 安卓人工智能系统
- 2026年中国医美行业发展白皮书
- 2026年中国光电芯片现状研究及发展趋势预测
- 2026年秋新版道德与法治(道法)五年级上册全册分课时作业附答案
- 新版小学道德与法治新部编版四年级上册全册教案(2026秋新版)合集
- 2026语文新教材 统编版语文六年级上册第四单元 语文园地四 教学课件
- 单孔钢筋混凝土箱涵计算书(公路荷载明涵)
- 2026年甘肃省机关事业单位选调工作人员考试(公共基础知识)仿真试题及答案
- 2026年共青团入团考试测试题库(含答案)
- T-CIRA 70-2024 钇90Y玻璃微球标准
- 青春健康师资考试历年真题
- 2026年10月自考动漫艺术概论试题及标准答案
评论
0/150
提交评论