版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java集合高频面试题及详细答案(实战版)一、基础概念面试题1.说一说Java集合的整体架构,集合和数组的区别?参考答案:Java集合主要分为两大核心体系:Collection单列集合、Map双列集合。Collection核心子接口:List(有序可重复)、Set(无序不可重复)、Queue(队列);Map核心实现类:HashMap、LinkedHashMap、TreeMap、HashTable。集合和数组的核心区别:1.长度区别:数组长度固定,初始化后无法修改;集合长度动态可变,可随意增删元素。2.存储类型:数组可存储基本数据类型和引用类型;集合只能存储引用类型,基本类型会自动装箱。3.功能丰富度:数组只有基础的存取、遍历功能;集合封装了增删改查、排序、去重、批量操作等大量实用方法。4.线程安全:数组无线程安全概念;部分集合线程不安全(HashMap、ArrayList),部分安全(HashTable、Vector)。2.List、Set、Map三者的核心区别是什么?参考答案:1.List:有序、可重复。元素存入顺序和取出顺序一致,支持下标索引访问,典型实现:ArrayList、LinkedList、Vector。2.Set:无序、不可重复。无下标索引,依靠元素自身规则去重,典型实现:HashSet、LinkedHashSet、TreeSet。3.Map:键值对存储(key-value),key无序不可重复,value可重复。无继承Collection接口,独立体系,典型实现:HashMap、TreeMap。二、List集合高频面试题1.ArrayList和LinkedList的区别,日常开发如何选择?参考答案:底层结构:ArrayList基于动态数组实现;LinkedList基于双向链表实现。查询效率:ArrayList支持随机下标访问,查询速度极快;LinkedList无下标,遍历查询需要从头节点开始,速度慢。增删效率:ArrayList中间、头部增删元素需要移动数组元素,效率低;尾部增删效率较高;LinkedList任意位置增删只需修改节点指针,无需移动元素,效率更高。内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点包含前驱、后继指针,单个元素内存占用更大。使用场景:日常开发中查询、遍历居多,极少增删优先用ArrayList;频繁在头部、中间做增删操作时使用LinkedList。90%的业务场景都适合用ArrayList。2.ArrayList的扩容机制详细讲一下?默认初始容量、扩容比例是多少?参考答案:JDK1.8及以上版本:ArrayList默认初始容量为0,首次调用add()添加元素时,会初始化容量为10。当数组元素个数达到当前容量上限时,触发扩容:新容量=原容量+原容量/2,也就是1.5倍扩容。扩容核心流程:1.添加元素前校验数组容量,判断是否需要扩容;2.计算新的数组容量;3.通过Arrays.copyOf()复制原数组所有元素到新数组;4.释放原数组内存,将新元素存入新数组。补充:如果一次性添加大量元素,1.5倍扩容后容量仍不足,会直接以所需最小容量作为新容量,避免多次扩容。3.ArrayList是否线程不安全?什么场景会出问题?怎么解决?参考答案:ArrayList是线程不安全的集合,底层add方法没有加锁。并发问题场景:多线程同时调用add方法添加元素时,可能出现元素覆盖、数组越界异常、元素丢失的问题。多个线程同时写入时,会覆盖彼此的赋值操作,最终导致集合实际元素数量少于预期。解决方案:1.使用Vector集合(效率低,不推荐);2.使用Collections.synchronizedList()包装集合;3.并发场景优先使用CopyOnWriteArrayList,读写分离,读不加锁、写加锁,并发性能更优。三、Set集合高频面试题1.HashSet去重原理是什么?为什么重写equals必须重写hashCode?参考答案:HashSet底层基于HashMap实现,存入元素时,本质是将元素作为HashMap的key,value为固定的空常量。去重流程:1.存入元素时,先调用对象的hashCode()方法计算哈希值,确定数组存储位置;2.如果该位置无元素,直接存入;3.如果该位置有元素,调用equals()方法对比两个对象内容;4.equals返回true,判定为重复元素,不存入;返回false,则发生哈希冲突,挂在链表/红黑树后面。重写equals必须重写hashCode的原因:如果只重写equals不重写hashCode,两个内容相同的对象,会调用默认的Object的hashCode方法,生成不同的哈希值。此时集合会判定为两个不同对象,导致去重失效,出现内容重复的元素,违反Set去重规则。2.HashSet、LinkedHashSet、TreeSet的区别和使用场景?参考答案:1.HashSet:底层HashMap,无序、查询效率高,无排序规则,日常普通去重场景首选。2.LinkedHashSet:继承HashSet,底层基于LinkedHashMap,保留元素插入顺序,可以去重且保证有序,性能略低于HashSet。3.TreeSet:底层TreeMap,自然排序或自定义排序(升序、降序),无序存储,取出元素为有序状态,适合需要自动排序的去重场景。四、Map集合核心面试题(重中之重)1.HashMap的底层原理,JDK1.7和JDK1.8的核心区别?参考答案:HashMap底层核心是「数组+链表+红黑树」,基于哈希表实现,用于存储key-value键值对。核心流程:通过key的hash值定位数组下标,hash冲突时链表存储,链表长度过长则转为红黑树,提升查询效率。JDK1.7与JDK1.8核心区别:1.数据结构:1.7只有数组+链表;1.8新增红黑树结构,解决链表过长查询慢的问题。2.插入方式:1.7链表采用头插法;1.8改为尾插法,彻底解决并发循环链表死循环问题。3.树化规则:链表长度超过8且数组容量大于64时,链表转为红黑树;链表长度小于6时退化为链表。4.扩容优化:1.8扩容后元素位置重分配更高效,无需重新计算hash值。2.HashMap默认容量、负载因子、树化阈值分别是多少?为什么这么设计?参考答案:1.默认初始容量:16(必须是2的幂次方,方便位运算计算下标,提升效率);2.默认负载因子:0.75;3.树化阈值:链表长度≥8,且数组容量≥64;4.退化阈值:链表长度≤6。负载因子0.75的设计原因:负载因子是空间和时间的平衡。如果设置过大(如1.0),数组填满才扩容,哈希冲突概率极高,链表过长,查询效率低;如果设置过小(如0.5),扩容过于频繁,浪费大量内存空间。0.75是官方权衡后的最优值。3.HashMap为什么线程不安全?并发场景用什么替代?参考答案:HashMap线程不安全体现在多线程并发写入场景:1.JDK1.7中,多线程扩容会出现循环链表死循环,导致CPU占用100%;2.所有版本中,多线程同时put元素会出现元素覆盖、数据丢失问题;3.多线程同时扩容、树化,会导致数据结构混乱,抛出异常。并发替代方案:1.HashTable:全程加同步锁,效率极低,基本不用;2.ConcurrentHashMap:并发场景首选,分段锁机制(1.7)、CAS+synchronized锁(1.8),线程安全且并发性能极高。4.HashMap和HashTable、ConcurrentHashMap的区别?参考答案:1.线程安全:HashMap线程不安全;HashTable、ConcurrentHashMap线程安全。2.null值存储:HashMap允许key和value为null;HashTable不允许key、value为null。3.加锁方式:HashTable是全局锁,所有线程竞争同一把锁,并发效率差;ConcurrentHashMap是局部锁,只锁定当前操作的桶,不影响其他桶,并发效率高。4.初始容量:HashMap默认16;HashTable默认11。五、集合实战坑点面试题1.遍历集合时,为什么不能用普通for/foreach删除元素?会报什么错?怎么正确删除?参考答案:foreach遍历底层依赖迭代器,遍历过程中集合的modCount(修改次数)会被记录。如果遍历中直接调用集合的remove()方法,会修改modCount,迭代器校验发现modCount不一致,直接抛出ConcurrentModificationException并发修改异常。错误场景:普通for循环删除可能出现元素跳过、漏删;foreach直接删除必报异常。正确删除方式:1.使用迭代器Iterator的remove()方法;2.JDK8+使用集合removeIf()方法(简洁高效,业务首选);3.倒序普通for循环删除(避免元素移位漏删)。2.集合初始化时,为什么建议指定初始容量?参考答案:ArrayList、HashMap等集合默认会自动扩容,而扩容需要数组复制、重新哈希,非常消耗性能。如果业务中能预知元素数量,手动指定初始容量,可以避免多次扩容、减少内存拷贝、提升代码性能。实操技巧:HashMap指定容量时,建议设置为「预估元素数量/0.75+1」,精准规避扩容。3.LinkedList能不能用普通for循环遍历?为什么不推荐?参考答案:可以用普通for循环根据下标遍历,但极度不推荐。LinkedList是双向链表,没有数组下标直接访问的能力,每次get(i)都会从首尾节点遍历查找对应位置元素。普通for循环遍历会重复遍历节点,时间复杂度从O(n)变成O(n²),数据量大时性能极差。正确遍历方式:迭代器、增强for循环、stream遍历。六、进阶综合面试题1.说说TreeMap的排序原理,如何实现自定义对象排序?参考答案:TreeMap底层基于红黑树,默认根据key的自然顺序排序(数字升序、字典序)。如果key是自定义对象,必须指定排序规则,否则会报类型转换异常。两种自定义排序方式:1.实体类实现Comparable接口,重写compareTo()方法,定义默认排序规则;2.创建TreeMap时传入Comparator比较
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年上海住院医师-上海住院医师公共科目历年参考题库含答案解析
- 2026山西省医疗卫生系统招聘考试(营养与食品卫生学)历年参考题库含答案详解
- 2026山西机关事业单位工人技术等级考试(客房服务员·高级)历年参考题库含答案详解
- 2026山东村(社区)退役军人专职联络员招聘考试历年参考题库含答案详解
- 2026导游资格-导游资格考试-导游资格考试历年参考题库含答案详解
- 2026安徽国企招聘考试(法务)历年参考题库含答案详解
- 2026天津市社区工作者招聘考试(行政职业能力测试)历年参考题库含答案详解
- 2026年电气巡检试题及答案
- 2026年公共卫生与健康教育测试试题及答案
- 污泥干化焚烧处置项目技术方案
- 注册安全工程师考试(初级)试卷与参考答案(2026年)
- 今天你光盘了吗 - 世界粮食日主题课件
- 肩周炎中医护理
- 2026年《计算机组成原理》培训试卷(含答案)
- 急性胆囊炎诊疗专家共识(2026版)
- 2026中国生物医药产业发展动态及投资前景预测报告
- 6.2 民主政治不断发展 课件(内嵌视频)2026-2027学年统编版道德与法治九年级上册
- 2026年司法考试《刑法》专项训练卷(附答案)
- 2026年低压电工证考试试题及答案
- 2026年广西壮族自治区百色市辅警招聘试题及答案
- 患者十大安全目标2025版(新)
评论
0/150
提交评论