Java集合高频面试题及详细答案(真实面试版)_第1页
Java集合高频面试题及详细答案(真实面试版)_第2页
Java集合高频面试题及详细答案(真实面试版)_第3页
Java集合高频面试题及详细答案(真实面试版)_第4页
Java集合高频面试题及详细答案(真实面试版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java集合高频面试题及详细答案(真实面试版)一、基础概念类(入门必问)1.Java集合框架有哪些核心体系?Collection和Map的区别?参考答案:Java集合主要分两大核心体系:Collection单列集合、Map双列集合。1.Collection:存储单个元素的单列集合,包含三大子接口:List:有序、可重复、有索引(ArrayList、LinkedList、Vector)Set:无序、不可重复、无索引(HashSet、LinkedHashSet、TreeSet)Queue:队列集合,先进先出(ArrayDeque、LinkedList)2.Map:存储键值对(key-value)双列集合,key唯一、value可重复(HashMap、LinkedHashMap、TreeMap、HashTable)核心区别:Collection存单个对象,Map存键值对;Collection元素直接存储,Map元素以key映射value的形式存储。2.List、Set、Map三者的核心特点区别?参考答案:List:有序(存入顺序和取出顺序一致)、可重复、支持下标索引,可通过索引精准操作元素Set:无序(部分实现有序)、元素不可重复、无索引,不能通过下标取值Map:双列存储,key唯一不重复,value可重复,key无序(部分实现有序),通过key获取value二、List集合高频面试题1.ArrayList和LinkedList的区别?工作中怎么选择?参考答案:底层结构:ArrayList:基于动态数组实现LinkedList:基于双向链表实现性能差异:查询/遍历:ArrayList快,数组支持随机访问,通过下标直接定位元素;LinkedList需要从头遍历,查询效率低增删操作:首尾增删LinkedList更快,只需修改节点指针;ArrayList会涉及数组移位、扩容,效率低使用场景:查询多、增删少、遍历多:优先用ArrayList(90%业务场景)频繁首尾增删、极少查询:用LinkedList2.ArrayList的扩容机制?默认容量、扩容比例是多少?参考答案:JDK1.8及以上:默认空参构造创建的ArrayList,初始为空数组,第一次添加元素时初始化容量为10当数组元素满了之后触发扩容,每次扩容为原容量的1.5倍(原容量+原容量右移1位)扩容时会创建新数组,将原数组元素复制到新数组,废弃原数组补充:指定初始容量的构造方法,会直接初始化对应大小的数组,不会延迟初始化。3.ArrayList为什么线程不安全?怎么解决?参考答案:ArrayList所有方法都没有加锁,多线程环境下并发读写会出现问题:并发添加可能导致元素覆盖、数组越界异常最终出现元素丢失、集合size不准确等问题解决方案:使用Vector(效率低,全局锁,基本不用)使用Collections.synchronizedList()包装集合推荐:使用CopyOnWriteArrayList(JUC并发集合,读写分离,适合读多写少场景)三、Set集合高频面试题1.HashSet底层原理?为什么元素不可重复?参考答案:HashSet底层本质就是HashMap,HashSet的add方法本质是调用HashMap的put方法,存入的元素作为HashMap的key,value是固定的空对象。去重原理:添加元素时,先调用对象的hashCode()计算哈希值,确定数组存储位置如果该位置没有元素,直接存入如果该位置有元素,调用equals()比较内容hashCode相同+equals为true,判定为重复元素,不存入;否则视为不同元素,形成哈希冲突重点:想要自定义对象去重,必须重写hashCode和equals方法,缺一不可。2.HashSet、LinkedHashSet、TreeSet的区别?参考答案:HashSet:无序、不重复,底层HashMap,查询效率高,日常去重首选LinkedHashSet:有序(保留插入顺序)、不重复,底层哈希表+双向链表,比HashSet多维护顺序,性能稍低TreeSet:自然排序/自定义排序、不重复,底层红黑树,可自动排序,增删查效率略低四、Map集合核心面试题(重中之重)1.HashMap底层原理(JDK1.8)?参考答案:JDK1.8HashMap底层是数组+链表+红黑树结构,核心流程:初始化:默认容量16,负载因子0.75,阈值=容量*负载因子(12)存储key-value时,通过key的hash值计算数组下标下标位置为空:直接存入下标位置有元素:发生哈希冲突,挂链表链表长度>=8且数组容量>=64:链表转为红黑树,提升查询效率链表长度<=6:红黑树退化为链表元素数量超过阈值,触发扩容,扩容为原容量2倍2.为什么负载因子是0.75?不能用0.5或者1?参考答案:负载因子是平衡空间利用率和哈希冲突概率的关键值:负载因子1:空间利用率最高,但哈希冲突极多,链表超长,查询效率暴跌负载因子0.5:冲突少、效率高,但空间浪费严重,频繁扩容消耗性能0.75是官方最优折中值,在空间和性能之间达到最佳平衡3.HashMap为什么线程不安全?并发场景有什么问题?参考答案:HashMap读写均无锁,多线程并发下存在安全问题:数据覆盖:多线程同时put元素,可能互相覆盖,导致数据丢失扩容死链(JDK1.7):旧版本扩容迁移元素时链表倒置,并发会形成循环链表,get时死循环元素丢失、size统计错误并发解决方案:优先使用ConcurrentHashMap,不推荐HashTable(全局同步锁,效率极低)4.HashMap和ConcurrentHashMap的区别?参考答案:线程安全:HashMap不安全;ConcurrentHashMap线程安全加锁方式:JDK1.8ConcurrentHashMap采用CAS+synchronized锁桶(数组节点),不是全局锁,并发性能极高空值支持:HashMap允许key、value为null;ConcurrentHashMap不允许key和value为null效率:单线程HashMap快,多线程ConcurrentHashMap碾压HashTable5.LinkedHashMap和TreeMap的区别?参考答案:LinkedHashMap:底层哈希表+双向链表,保留插入顺序,可实现LRU缓存策略,查询快TreeMap:底层红黑树,按键自动排序(自然排序/自定义比较器),适合需要有序key的场景五、集合高频坑点&实操面试题1.为什么重写equals必须重写hashCode?参考答案:如果只重写equals不重写hashCode,会违反Java规范:两个equals相等的对象,hashCode必须相等。会出现的问题:两个内容完全相同的对象,equals为true,但hashCode不同,在HashSet、HashMap中会被判定为两个不同对象,导致去重失效,业务出现重复数据。补充:hashCode不同,equals一定不同;hashCode相同,equals不一定相同(哈希冲突)。2.集合遍历中能不能删除元素?为什么会报ConcurrentModificationException?参考答案:普通for/增强for循环遍历集合时,不能直接调用集合的remove/add方法,会触发并发修改异常。异常原因:集合内部维护modCount(修改次数),迭代器遍历会记录expectedModCount,遍历过程中集合修改元素,modCount改变,和expectedModCount不匹配,直接抛异常。正确删除方式:使用迭代器Iterator的remove方法JDK8+使用removeIf方法普通for倒序遍历删除(避免数组移位导致漏删)3.数组和集合的区别?参考答案:数组长度固定,集合长度可变、自动扩容数组可存基本类型+引用类型,集合只能存引用类型(基本类型自动装箱)数组无封装方法,增删查改需要手动写;集合封装了大量增删改查、排序、遍历方法4.什么是fail-fast(快速失败)?什么是fail-safe(安全失败)?参考答案:fail-fast:普通集合(ArrayList、HashMap)遍历期间检测到集合修改,直接抛并发修改异常,防止脏数据,遍历不可修改。fail-safe:并发集合(CopyOnWriteArrayList)遍历不抛异常,遍历的是集合快照,原集合可以修改,牺牲一致性换并发效率,适合读多写少场景。六、面试压轴题1.工作中HashMap会踩哪些坑?怎么规避?参考答案:坑1:自定义对象作为key不重写hashCode和equals,导致去重失效、取值异常

规避:自定义对象做key必须重写两个方法坑2:默认容量过小,频繁扩容影响性能

规避:预估数据量,初始化时指定合适容量(初始容量=预计元素数量/0.75+1)坑3:并发使用HashMap导致数据丢失

规避:并发场景一律用ConcurrentHashMap坑4:key为null空指针

规

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论