版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java容器高频面试题及详细答案(实战向)一、Java容器基础概念1.说一说Java集合框架的整体结构Java集合主要分为两大核心体系:Collection单列集合和Map双列集合,所有集合工具都基于这两个根接口延伸,整体结构清晰、分工明确。1.Collection(存储单个元素)List:有序、可重复、支持索引访问,核心实现:ArrayList、LinkedList、VectorSet:无序、不可重复、无索引,核心实现:HashSet、LinkedHashSet、TreeSetQueue:队列结构,遵循先进先出,核心实现:ArrayDeque、LinkedList、PriorityQueue2.Map(存储键值对K-V,键唯一、值可重复)核心实现:HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap除此之外,还有工具类Collections、Arrays,以及并发包下的线程安全集合,覆盖普通场景和高并发场景。2.Collection和Collections的区别Collection:是所有单列集合的根接口,定义了List、Set、Queue的通用方法,比如add、remove、size、clear等,是集合的顶层规范。Collections:是一个工具类,全是静态方法,专门用来操作集合对象,提供排序、打乱、线程安全包装、空集合创建等功能,不能实例化。简单总结:Collection是集合的父接口,Collections是操作集合的工具类。3.数组和集合的区别长度差异:数组长度固定,初始化后无法修改;集合长度动态扩容,可根据元素数量自动伸缩。存储类型:数组可以存基本数据类型和引用类型;集合只能存引用类型,基本类型会自动装箱。功能适配:数组方法极少,仅能通过索引操作;集合封装了增删改查、遍历、排序、去重等丰富方法,适配业务场景。泛型支持:数组无泛型,存在类型转换风险;集合支持泛型,编译期校验类型,避免类型转换异常。二、List集合高频面试题1.ArrayList和LinkedList的区别?日常开发如何选择?核心区别底层结构:ArrayList基于动态数组;LinkedList基于双向链表。查询效率:ArrayList支持随机索引访问,查询速度极快;LinkedList必须从头/尾遍历,查询效率低。增删效率:首尾增删元素,LinkedList效率更高,仅需修改节点指针;ArrayList中间增删需要移动数组元素,可能触发扩容,开销大。内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点存储数据和前后指针,单个元素内存占用更高。线程安全:两者都是非线程安全,多线程环境下需手动同步或使用并发集合。使用选择绝大多数业务场景:优先用ArrayList,日常开发查询远多于增删。频繁首尾增删、极少查询的场景:使用LinkedList。2.ArrayList的扩容机制(JDK1.8)1.ArrayList初始化空参构造时,默认创建空数组,不会立即分配10个容量,首次添加元素时才初始化容量为10,节省内存。2.当数组元素数量达到当前容量阈值时,触发扩容:扩容规则:新容量=原容量+原容量/2,也就是1.5倍扩容。扩容流程:创建新数组→复制原数组所有元素到新数组→替换底层数组引用。3.如果一次性添加大量元素,1.5倍扩容仍不够,会直接以实际所需元素数量作为新容量,避免多次扩容。4.最大容量固定为Integer.MAX_VALUE-8,防止内存溢出。3.ArrayList为什么线程不安全?多线程场景会出现什么问题?ArrayList的增删改查方法都没有加同步锁,多线程并发操作时会出现数据异常,核心问题有两个:元素覆盖:多个线程同时执行add方法,可能出现后写入的元素覆盖先写入的元素,导致数据丢失。数组越界异常:并发添加元素时,多个线程同时判断容量足够,同时写入后超出数组最大容量,抛出ArrayIndexOutOfBoundsException。解决方案:使用Vector(效率低)、Collections.synchronizedList包装、CopyOnWriteArrayList(推荐)。4.Vector和ArrayList的区别线程安全:Vector所有方法都加了synchronized锁,线程安全;ArrayList非线程安全。扩容机制:ArrayList1.5倍扩容;Vector默认2倍扩容,可自定义扩容增量。效率:Vector锁竞争严重,并发效率极低,日常开发基本不用。初始化:Vector空参构造直接初始化10容量数组,无延迟加载。三、Set集合高频面试题1.HashSet的底层原理?为什么元素不可重复?HashSet底层本质是HashMap,HashSet的add、remove、contains方法都是直接调用HashMap的对应方法实现。HashSet存储元素时,会将元素作为HashMap的key,value固定为一个静态空对象,利用HashMap键唯一的特性实现去重。去重判断流程:调用元素的hashCode()计算哈希值,确定数组存储位置;如果该位置无元素,直接存入;如果该位置有元素,调用equals()比较内容;hashCode相同且equals返回true,判定为重复元素,不存入;否则存入链表/红黑树。核心结论:自定义对象存入HashSet,必须重写hashCode()和equals(),否则无法正常去重。2.HashSet、LinkedHashSet、TreeSet的区别HashSet:底层HashMap,无序、不重复,查询写入速度快,无排序规则,日常去重首选。LinkedHashSet:继承HashSet,底层LinkedHashMap,保留插入顺序,性能略低于HashSet,需要有序去重时使用。TreeSet:底层TreeMap,自然排序/自定义排序,默认升序,基于红黑树实现,查询速度稍慢,需要排序去重时使用。3.为什么重写equals必须重写hashCode?如果只重写equals不重写hashCode,会违反Java规范:两个对象equals相等,哈希值必须相等。只重写equals的问题:两个内容完全相同的对象,equals返回true,但默认hashCode基于对象地址生成,哈希值不同。存入HashSet/HashMap时,会被判定为两个不同对象,导致去重失效,出现重复数据。反之,只重写hashCode不重写equals,会出现哈希值相同但内容不同的对象被误判为重复,同样会出错。四、Map集合高频面试题(核心重点)1.HashMap的底层原理(JDK1.8)JDK1.8HashMap底层是数组+链表+红黑树的复合结构,核心是解决哈希冲突、平衡查询效率。核心参数默认初始容量:16负载因子:0.75扩容阈值:容量×负载因子,达到阈值触发扩容树化阈值:链表长度>=8且数组容量>=64,链表转为红黑树链表还原阈值:红黑树节点数<=6,退化为链表存储流程通过key的hashCode()计算哈希值,经过二次哈希扰动,减少哈希冲突;通过哈希值&(容量-1)计算数组下标;下标位置无元素,直接存入键值对;下标位置有元素,比较key哈希值和equals:key相同则覆盖value,key不同则挂载到链表尾部;链表长度达到树化阈值,触发树化,转为红黑树提升查询效率;元素数量达到扩容阈值,触发2倍扩容,重新哈希分布元素。2.JDK1.7和JDK1.8HashMap的核心区别数据结构:1.7仅数组+链表;1.8新增红黑树,解决长链表查询慢的问题。插入方式:1.7链表头插法;1.8链表尾插法,避免多线程扩容出现环形链表死循环。哈希扰动:1.8优化哈希算法,扰动次数更少,效率更高。扩容机制:1.7重新计算所有元素哈希位置;1.8利用高低位拆分,无需全部重算,扩容效率提升。3.HashMap为什么线程不安全?JDK1.8还存在死循环问题吗?HashMap全程无锁,多线程并发put、扩容时存在安全问题:数据覆盖:多线程同时put相同下标元素,会覆盖数据,导致元素丢失。扩容数据丢失:并发扩容时,部分元素迁移失败,造成数据缺失。JDK1.8改为尾插法,解决了1.7的环形链表死循环问题,但依然线程不安全,不能用于多线程环境。4.HashMap的负载因子为什么是0.75?不能用0.5或1.0?负载因子是空间利用率和查询效率的平衡值:负载因子0.5:扩容时机过早,空间利用率低,频繁扩容浪费性能,内存占用高。负载因子1.0:空间利用率拉满,但哈希冲突概率大幅提升,链表越来越长,查询效率急剧下降。负载因子0.75:在空间利用率和查询效率之间达到最优平衡,是官方经过大量测试的最优值。5.LinkedHashMap如何实现有序?如何实现LRU缓存?LinkedHashMap底层基于HashMap,额外维护了一条双向链表,默认保留元素插入顺序。它有一个专属构造方法,可开启访问排序模式:accessOrder=true。开启后,每访问一个元素,就会将该元素移到链表尾部,实现最近访问的元素在后、最少访问的元素在前。重写removeEldestEntry方法,定义缓存最大容量,超出容量时自动删除最久未访问的元素,即可简易实现LRU缓存。6.TreeMap的原理和使用场景TreeMap底层基于红黑树,默认根据key的自然顺序排序,也可自定义比较器排序。key必须实现Comparable接口或传入Comparator比较器,否则会抛出类型转换异常。适用场景:需要对Map的键进行自动排序的业务场景,缺点是增删查效率低于HashMap。7.HashMap和Hashtable的区别线程安全:Hashtable方法加synchronized,线程安全;HashMap非线程安全。空值支持:HashMap允许一个null键、多个null值;Hashtable不允许null键和null值。扩容机制:HashMap默认16、2倍扩容;Hashtable默认11、2倍+1扩容。效率:Hashtable锁粒度大,并发效率极低,基本被淘汰。五、并发容器高频面试题1.ConcurrentHashMap线程安全原理(JDK1.8)JDK1.8ConcurrentHashMap放弃了1.7的分段锁,采用CAS+synchronized锁实现线程安全,锁粒度细化到数组单个节点,并发效率大幅提升。核心原理无冲突时,通过CAS无锁操作写入,性能极高;发生哈希冲突时,对当前数组下标节点加synchronized锁,只锁住当前链表/红黑树,不影响其他节点并发操作;扩容、树化、迁移等操作都做了并发控制,保证线程安全。相比Hashtable的全局锁,ConcurrentHashMap锁粒度更小、并发度更高,是多线程键值存储的首选。2.CopyOnWriteArrayList原理及适用场景CopyOnWriteArrayList是线程安全的List,核心思想是写时复制。核心原理读操作:无锁,直接读取原数组,速度极快;写操作(增删改):加锁,先复制一份新数组,在新数组上修改数据,修改完成后将原数组引用指向新数组;写入过程不影响原有读操作,读写分离,不会出现并发异常。适用场景读多写少场景,比如配置缓存、白名单、常量列表等。写操作开销大,频繁写入场景不适用。3.并发容器和普通同步集合的区别普通同步集合(Vector、synchronizedList):基于全局synchronized锁,所有线程竞争同一把锁,同一时间只能一个线程操作,并发效率极低。JUC并发容器:采用CAS、分段锁、读写分离等精细锁机制,支持多线程并发读写,并发性能远优于普通同步集合。六、容器常见坑点与实战问题1.集合遍历中为什么不能增删元素?迭代器并发修改异常原因普通for/foreach遍历集合时增删元素,会抛出ConcurrentModificationException并发修改异常。原因:集合内部维护一个modCount修改计数器,迭代器初始化时会记录当前modCount。遍历过程中,如果集合被修改,modCount会变化,迭代器校验发现数值不一致,直接抛出异常,防止遍历数据错乱。解决方案:使用迭代器自带的remove方法,或使用并发容器。2.如何正确遍历并删除List元素?推荐方式:Iterator迭代器遍历删除、List迭代器特有remove方法、JDK8+removeIf方法(最简)。不推荐:普通foreac
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 组织评价反馈交流会议促进经验共享
- 引导积极倾听习惯加深彼此间认识
- 2026年海南省加工中心多轴联动加工技术试题及答案
- 2026年重庆市渝中区实验小学三年级英语下册口语交际专项训练习题及答案
- 苏教版高中语文文言文阅读理解习题集及答案
- 2026年辽宁省辽教版初中地理七年级下册第4章气候练习题及答案
- 商务楼宇智能化改造合同协议二篇
- 2026中国智能智能虚拟现实旅游行业市场现状供需分析及投资评估规划分析研究报告
- 2026紫外线杀菌行业市场进入深度考察及茶具消毒与食品安全管理系统
- 2026远程办公软件市场发展分析及用户需求与商业模式优化研究报告
- 建筑垃圾减量化监理监督实施细则
- 骨科术后加速康复营养支持方案
- 易制毒、易制爆危险化学品盗抢破坏和丢失事故应急预案
- 分级诊疗与肿瘤全程管理策略
- 中国海洋石油校招笔试题及答案
- 2025年wset二题库及答案
- 雨课堂在线学堂《创新思维与战略管理》作业单元考核答案
- 厂房彩钢拆除合同范本
- 学堂在线 大数据机器学习 章节测试答案
- 煤矿防灭火安全培训课件
- 政府采购评审专家考试试题库及答案(完整版)
评论
0/150
提交评论