版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaList集合高频面试题及详细答案(实战版)一、基础概念类面试题1、List集合的特点是什么?和Set、Map有什么核心区别?参考答案:List是Java单列集合中最常用的有序可重复集合,核心特点有三个:1.有序性:保留元素添加顺序,存入顺序和取出顺序一致;2.可重复性:允许存储重复元素;3.有索引:支持通过下标索引精准操作元素,拥有丰富的索引操作方法。三者核心区别:-List:有序、可重复、有索引;-Set:无序、不可重复、无索引;-Map:双列集合,键值对存储,键不可重复、值可重复,无索引。2、List常用实现类有哪些?各自的应用场景?参考答案:日常开发中最常用的三个实现类:ArrayList、LinkedList、Vector1.ArrayList:基于动态数组实现,查询、遍历速度极快,增删末尾元素效率高,中间、头部增删效率低;日常开发首选,绝大多数查询、遍历场景使用。2.LinkedList:基于双向链表实现,头尾增删元素效率极高,随机查询速度慢;适合频繁增删首尾元素的场景,可作为栈、队列、双端队列使用。3.Vector:古老的动态数组集合,所有方法加了synchronized锁,线程安全但并发效率极低,现在基本废弃,不推荐使用。3、List接口常用方法有哪些?参考答案:除了Collection通用方法,List独有索引操作核心方法:-add(intindex,Eelement):指定下标插入元素;-get(intindex):根据下标获取元素;-set(intindex,Eelement):修改指定下标元素;-remove(intindex):根据下标删除元素,返回被删除元素;-indexOf(Objecto):返回元素第一次出现的下标;-lastIndexOf(Objecto):返回元素最后一次出现的下标;-subList(intfromIndex,inttoIndex):截取子集合。二、ArrayList核心面试题(高频重点)1、ArrayList的底层实现原理?参考答案:ArrayList底层基于可变长度的Object数组实现,核心原理是:数组固定长度不可变,ArrayList通过自动扩容机制实现动态存储。1.底层存储:transientObject[]elementData;2.初始容量:JDK1.7及以后,空参构造创建空数组,首次添加元素时初始化容量为10;3.扩容机制:当数组存满后,触发扩容,新容量为原容量的1.5倍;4.扩容方式:通过Arrays.copyOf()复制原数组元素到新数组,完成扩容替换。2、ArrayList空参构造初始化容量是多少?JDK1.6、1.7、1.8的区别?参考答案:-JDK1.6:空参构造直接初始化容量为10的数组,创建对象就占用内存;-JDK1.7、1.8:空参构造初始化空数组(容量0),采用懒加载机制,第一次调用add()添加元素时,才初始化容量为10的数组,节省空集合的内存空间。日常面试标准答案:新版JDK中ArrayList空参创建初始容量为0,首次add扩容为10。3、ArrayList的扩容机制详细流程?参考答案:1.每次添加元素前,先判断当前数组容量是否足够;2.如果数组已满,触发扩容机制,计算新容量:原容量+原容量/2(1.5倍扩容);3.如果1.5倍扩容后容量仍不足(批量添加大量元素场景),直接使用所需最小容量作为新容量;4.通过Arrays.copyOf()方法,开辟新数组,复制原数组所有元素;5.将原数组引用指向新数组,完成扩容,再添加新元素。补充:ArrayList最大容量为Integer.MAX_VALUE-8,避免内存溢出。4、ArrayList为什么查询快、增删慢?参考答案:查询快:底层是数组,数组在内存中连续存储,支持随机访问,通过下标可直接定位元素,时间复杂度O(1)。增删慢:1.中间、头部增删元素时,需要移动大量元素,完成数组移位,时间复杂度O(n);2.元素满了之后需要扩容,扩容涉及数组复制、开辟新内存,开销较大;3.只有末尾增删元素效率较高,无需大量移位。5、ArrayList是否线程安全?为什么?如何解决?参考答案:ArrayList是非线程安全的,所有方法无同步锁。不安全原因:多线程环境下,多个线程同时执行add、写入操作,可能出现覆盖写入、元素丢失、数组越界异常等问题。因为add操作的扩容、赋值步骤不具备原子性,多线程并发会产生竞态条件。线程安全解决方案:1.使用Vector(不推荐,效率极低);2.Collections.synchronizedList()包装集合(适合低并发场景);3.推荐:CopyOnWriteArrayList(高并发读写场景,读写分离,读不加锁、写加锁)。三、LinkedList核心面试题1、LinkedList底层实现原理?参考答案:LinkedList底层基于双向链表实现,每个节点是一个Node对象,包含三个属性:item(当前元素)、prev(上一个节点引用)、next(下一个节点引用)。集合中维护first首节点、last尾节点,无固定容量,无需扩容,内存空间不连续。支持从头尾快速增删元素,不支持随机快速访问。2、LinkedList为什么增删快、查询慢?参考答案:增删快:链表增删元素只需修改节点的prev和next引用指向,无需移动大量元素,头尾增删时间复杂度O(1)。查询慢:链表内存不连续,无随机访问能力,根据下标查询元素时,需要从头节点或尾节点逐个遍历匹配,时间复杂度O(n)。优化细节:LinkedList查询会做二分判断,查询下标靠前从头遍历,靠后从尾遍历,稍微提升效率,但整体仍远低于数组。3、LinkedList能不能当做栈、队列使用?参考答案:可以。LinkedList实现了List、Deque接口,Deque是双端队列接口,具备栈和队列的所有特性。-当做队列:offer()入队、poll()出队(先进先出);-当做栈:push()入栈、pop()出栈(后进先出);实际开发中,简单栈队列场景可用LinkedList,高并发场景推荐使用JUC包下专用队列。四、ArrayList和LinkedList高频对比题1、ArrayList和LinkedList的核心区别?参考答案:对比维度ArrayListLinkedList底层结构动态数组双向链表查询效率快,随机访问O(1)慢,遍历查询O(n)增删效率头尾快、中间慢,需移位扩容头尾极快,只需修改引用内存占用内存连续,空闲空间少每个节点额外存引用,内存开销大线程安全非线程安全非线程安全2、开发中如何选择ArrayList和LinkedList?参考答案:1.绝大多数场景选ArrayList:业务以查询、遍历为主,少量增删操作,是日常开发首选;2.高频头尾增删场景选LinkedList:比如频繁插入、删除首尾数据,实现队列、栈结构;3.绝对不要用LinkedList做批量查询、随机下标获取元素,性能极差。五、并发List集合面试题1、CopyOnWriteArrayList原理及适用场景?参考答案:核心原理:写时复制。1.读操作:直接读取原数组,不加锁,并发读取效率极高;2.写操作(增删改):加ReentrantLock锁,先复制原数组生成新数组,在新数组上完成修改,修改完成后将原数组引用指向新数组;3.写操作不影响读操作,读写分离,解决并发安全问题。适用场景:读多写少的高并发场景,比如配置缓存、白名单、常量列表等。缺点:写操作需要复制数组,内存开销大,写入性能差;只能保证数据最终一致性,不保证实时一致性,遍历的时候可能读取到旧数据。2、CopyOnWriteArrayList和SynchronizedList的区别?参考答案:1.锁机制不同:SynchronizedList是全部方法加同步锁,读写互斥;CopyOnWriteArrayList读无锁、写加锁;2.并发性能不同:读多写少场景下,CopyOnWriteArrayList性能远高于SynchronizedList;写多场景下两者性能都差;3.数据一致性:SynchronizedList保证强一致性;CopyOnWriteArrayList是弱一致性;4.遍历容错:SynchronizedList遍历期间修改集合会报并发修改异常;CopyOnWriteArrayList遍历不会报错。六、List常见坑点面试题(实战必考)1、List遍历过程中为什么不能直接删除/添加元素?会报什么异常?参考答案:会抛出ConcurrentModificationException(并发修改异常)。异常原理:ArrayList内部维护modCount(修改次数)和expectedModCount(迭代器预期修改次数)。普通for/增强for遍历的时候,迭代器会校验两个值是否相等;如果遍历过程中直接调用集合的add/remove方法,modCount会自增,但expectedModCount不变,两者不匹配,直接抛出异常。正确解决方式:1.使用迭代器Iterator自带的remove()方法;2.使用普通for倒序遍历删除(避免下标移位漏元素);3.JDK8+使用stream流filter过滤筛选。2、subList方法会产生新集合吗?有什么坑?参考答案:subList不会创建新的ArrayList集合,只是返回原集合的一个视图,底层仍然引用原数组。核心坑点:1.对子集合进行增删改操作,会直接影响原集合;2.如果操作完subList后,修改原集合结构,再次操作子集合会抛出并发修改异常;解决方案:如果需要独立的子集合,手动newArrayList(subList)新建集合。3、Arrays.asList()转换集合的坑?参考答案:1.Arrays.asList()返回的不是java.util.ArrayList,是Arrays内部的静态内部类集合;2.该集合长度固定,不支持add、remove、clear方法,调用会抛出UnsupportedOperationException异常;3.该集合直接引用原数组,修改集合元素会同步修改原
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年上海体育学院应用心理学专业《普通心理学》期末试卷B(有答案)
- 2026全国安全员A证-企业负责人(官方)-第三章安全生产主要法律法规参考试题库历年考点答案详解
- 2026住院医师规培-黑龙江-黑龙江住院医师规培(骨科)历年参考题库含答案详解
- 2026中国AR-VR内容生态构建与用户增长潜力报告
- 2026住院医师规培-甘肃-甘肃住院医师规培(内科)历年参考题库含答案详解
- 2026住院医师规培-河南-河南住院医师规培(胸心外科)历年参考题库含答案详解
- 2026住院医师规培-江苏-江苏住院医师规培(心血管内科)历年参考题库含答案详解
- 2026住院医师规培-山西-山西住院医师规培(耳鼻咽喉科)历年参考题库含答案详解
- 2026住院医师规培-宁夏-宁夏住院医师规培(口腔正畸科)历年参考题库含答案详解
- 2026住院医师规培-内蒙古-内蒙古住院医师规培(胸心外科)历年参考题库含答案详解
- 危重症护理中的人文关怀与艺术
- 蝎子养殖技术培训课件
- T-SZRCA 011-2025 人形机器人专用线缆技术规范
- 高三运动会课件
- 中国象棋入门教学课件
- 徒步应急知识培训总结课件
- 河南省2022-2024年中考满分作文49篇
- 儿童脓毒性休克护理查房
- 钢铁工业行业“十五五”发展规划
- 生态学基础概念知识点试题及答案
- 采购交期管理培训
评论
0/150
提交评论