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

下载本文档

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

文档简介

List、Set、Map高频面试题及详细答案(真实面试版)一、基础概念类面试题1、说一说List、Set、Map三者的核心区别?参考答案:三者是Java集合框架最核心的三类接口,核心差异体现在有序性、可重复性、存储结构上:List(列表):有序、可重复。元素存入顺序和取出顺序一致,允许存放重复元素、null值。底层是线性结构,支持通过下标索引精准取值。常见实现:ArrayList、LinkedList、Vector。Set(集合):无序、不可重复。不允许存储重复元素,多数实现无下标索引,无法通过索引取值。允许存一个null值。常见实现:HashSet、LinkedHashSet、TreeSet。Map(映射):键值对存储,key唯一、value可重复。key不允许重复,value可以重复,key最多存一个null,value可以存多个null。不属于Collection体系,独立存储键值对数据。常见实现:HashMap、LinkedHashMap、TreeMap、HashTable。2、List、Set、Map分别默认的排序规则是什么?参考答案:List:默认插入有序,怎么存怎么取,不自动排序。HashSet:无序,基于哈希值散列存储,存取顺序不一致。LinkedHashSet:插入有序,保留元素存入顺序。TreeSet:自然排序(升序),可自定义比较器排序。HashMap:完全无序,散列存储。LinkedHashMap:插入有序(可开启访问有序)。TreeMap:根据key自然排序。二、List专项高频面试题1、ArrayList和LinkedList的区别?日常开发怎么选择?参考答案:底层结构:ArrayList:基于动态数组实现,连续内存空间。LinkedList:基于双向链表实现,零散内存节点。性能差异:查询/改值:ArrayList效率极高,支持随机访问,时间复杂度O(1);LinkedList需要遍历链表,时间复杂度O(n)。增删元素:尾部增删两者差距小;中间、头部增删LinkedList更快,只需修改节点指针;ArrayList需要数组移位、扩容,开销大。使用场景:绝大多数业务场景:优先用ArrayList(业务多查少改、尾部增删居多)。频繁在头部/中间插入、删除数据,极少查询:用LinkedList。2、ArrayList的扩容机制了解吗?默认初始容量、扩容比例是多少?参考答案:JDK1.8版本:ArrayList默认初始容量0,首次添加元素时,初始化容量为10。当数组容量不足触发扩容时,每次扩容为原容量的1.5倍(oldCapacity+oldCapacity>>1)。扩容过程会创建新数组,复制原数组所有元素,这也是ArrayList扩容耗时的核心原因。所以批量添加大量数据时,建议提前指定初始容量,减少频繁扩容。3、ArrayList和Vector的区别?为什么不推荐用Vector?参考答案:线程安全:Vector所有方法加了synchronized,线程安全;ArrayList非线程安全。扩容机制:Vector默认扩容2倍;ArrayList扩容1.5倍,空间利用率更高。性能:Vector锁粒度太大,全局锁,并发性能极差。日常开发不推荐Vector,需要线程安全List优先用CopyOnWriteArrayList,并发性能远优于Vector。三、Set专项高频面试题1、HashSet怎么保证元素不重复的?底层原理是什么?参考答案:HashSet底层本质是HashMap,存入元素时,就是把元素作为HashMap的key,value固定为一个空常量对象。去重核心逻辑:先调用对象的hashCode()计算哈希值,确定数组存储位置;如果该位置无元素,直接存入;如果该位置已有元素,再调用equals()比对内容;hashCode相同且equals为true,判定为重复元素,不存入;否则正常存入。这也是开发中自定义对象存入HashSet,必须重写hashCode和equals方法的原因,否则会出现去重失效的问题。2、HashSet、LinkedHashSet、TreeSet区别和使用场景?参考答案:HashSet:无序、查询效率高,底层HashMap。适合只需要去重、不需要排序、不需要保留存入顺序的场景。LinkedHashSet:插入有序、可去重,底层LinkedHashMap。适合需要去重且保留元素存入顺序的场景,性能略低于HashSet。TreeSet:自动排序、可去重,底层TreeMap(红黑树)。适合需要自动升序排序的场景,增删查效率低于HashSet。3、TreeSet存储自定义对象为什么会报错?怎么解决?参考答案:TreeSet基于红黑树排序,需要元素具备比较规则。存储自定义对象时,默认没有比较逻辑,运行时会抛出ClassCastException。两种解决方式:自定义实体类实现Comparable接口,重写compareTo方法,定义默认排序规则;创建TreeSet时传入Comparator比较器,自定义临时排序规则(优先级更高)。四、Map专项高频面试题1、HashMap的底层结构(JDK1.8)?参考答案:JDK1.8HashMap底层是数组+链表+红黑树的复合结构:主体是哈希数组,每个数组位置称为一个桶;哈希冲突少时,桶内以单向链表存储数据;当链表长度>=8且数组容量>=64时,链表转化为红黑树,提升查询效率;当链表长度缩减到<=6时,红黑树退化为链表,减少树结构维护开销。核心目的:兼顾哈希表的快速查询,同时解决高并发、大量数据下链表过长导致的性能退化问题。2、HashMap默认参数、负载因子作用?为什么负载因子是0.75?参考答案:默认初始容量16,默认负载因子0.75,扩容阈值=容量*负载因子。负载因子控制数组填充密度:数值越大,数组利用率越高,但哈希冲突概率变大;数值越小,冲突越少,但扩容越频繁、空间浪费多。0.75是时间和空间的均衡值,经过官方测试验证,能最大程度平衡哈希冲突概率和内存利用率,是最优参数。3、HashMap、HashTable、ConcurrentHashMap三者区别?参考答案:1.HashMap非线程安全,key、value均可存null,效率高,适合单线程场景。并发环境下会出现数据覆盖、死循环等问题。2.HashTable线程安全,全局synchronized锁,锁整个哈希表,并发效率极低;key、value都不允许存null,基本已被淘汰。3.ConcurrentHashMapJDK1.8采用CAS+synchronized分段锁,只锁定当前桶位置,不影响其他桶读写,并发性能极高;key、value不允许null,是多线程场景下的首选Map。4、LinkedHashMap和HashMap的区别?怎么实现有序的?参考答案:LinkedHashMap继承自HashMap,底层多了一条双向链表,默认保留元素插入顺序。核心区别:HashMap无序,LinkedHashMap插入有序;LinkedHashMap可通过构造参数开启访问有序(最近访问的放末尾),可轻松实现LRU缓存策略;LinkedHashMap内存开销略高于HashMap,性能稍弱。5、TreeMap的特点?适用场景?参考答案:TreeMap底层是红黑树,根据key自动排序,默认自然排序,可自定义比较器。key不允许null,线程不安全。适用场景:需要根据key排序的键值对业务,比如排序展示、区间查询、有序字典等场景。五、高频对比&坑点面试题1、为什么重写equals必须重写hashCode?参考答案:如果只重写equals、不重写hashCode,会出现内容相等但哈希值不同的问题。在HashSet、HashMap中,会先判断哈希值再判断equals,会导致两个内容完全相同的对象,被判定为不同元素,无法去重,造成数据冗余、业务异常。规范:两个对象equals相等,hashCode必须相等;hashCode相等,对象不一定相等。2、List遍历时为什么不能直接增删元素?怎么解决?参考答案:普通for-each遍历中直接增删元素,会修改集合的modCount版本号,触发快速失败机制(fail-fast),抛出ConcurrentModificationException。解决方案:使用Iterator迭代器的remove方法;遍历时记录下标,遍历结束后统一增删;使用线程安全集合CopyOnWriteArrayList。3、fail-fast和fail-safe的区别?参考答案:fail-fast(快速失败):普通ArrayList、HashMap等,遍历过程中检测到集合被修改,直接抛异常,防止脏数据。fail-safe(安全失败):CopyOnWrite系列集合,遍历基于原数组快照,遍历过程中修改集合不会抛异常,遍历的是旧数据,适合读多写少场景。4、HashMap为什么不允许key为null?(易错纠正)参考答案:HashMap允许一个key为null,默认存入数组下标0的位置;value允许多个null。ConcurrentHashMap、HashTable不允许key和value为null。原因是并发场景下,null无法区分是key不存在还是value为null,会产生歧义,引发业务bug。六、手写实操面试题(简答)1、怎么快速对List去重?三种常用方式参考答案:借助HashSet:newArrayList<>(newHashSet<>(list)),无序去重;借助

温馨提示

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

评论

0/150

提交评论