Java集合高频面试题(真实面试版)_第1页
Java集合高频面试题(真实面试版)_第2页
Java集合高频面试题(真实面试版)_第3页
Java集合高频面试题(真实面试版)_第4页
Java集合高频面试题(真实面试版)_第5页
全文预览已结束

下载本文档

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

文档简介

Java集合高频面试题(真实面试版)一、基础概念类(入门必问)1.Java集合框架有哪些核心体系?区别是什么?Java集合主要分为两大核心体系:Collection单列集合和Map双列集合。Collection是单列集合顶层接口,存储单个元素,核心子接口有三个:List:有序、可重复、有索引。常用实现类:ArrayList、LinkedList、VectorSet:无序、不可重复、无索引。常用实现类:HashSet、LinkedHashSet、TreeSetQueue:队列结构,先进先出,常用于消息队列、线程池。常用实现类:ArrayDeque、LinkedListMap是双列集合顶层接口,存储键值对(key-value),key唯一、value可重复。常用实现类:HashMap、LinkedHashMap、TreeMap、Hashtable。2.数组和集合的区别?工作中怎么选择?核心区别有四点:长度:数组长度固定,集合长度动态可变存储类型:数组可存基本类型+引用类型,集合只能存引用类型(基本类型会自动装箱)方法:数组仅有少量原生方法,集合封装了增删改查、排序、遍历等丰富方法效率:数组访问效率更高,集合功能更灵活选择原则:固定数量元素、追求极致效率用数组;元素数量不确定、需要频繁增删查改用集合。3.Collection和Collections的区别?Collection:是集合顶层接口,定义了单列集合的通用方法,是集合体系的规范Collections:是集合工具类,全是静态方法,用来操作集合,比如排序、打乱、同步、空集合创建等二、List集合高频题1.ArrayList和LinkedList的底层原理和使用场景区别?ArrayList:底层是动态扩容的数组。优点:根据索引查询、遍历速度极快,随机访问效率高缺点:中间位置增删元素需要移动数组元素,效率低默认初始容量10,扩容1.5倍,线程不安全LinkedList:底层是双向链表。优点:首尾增删元素无需移动数据,只改节点指针,增删效率高缺点:随机查询需要从头遍历,索引查询效率极低场景选择:查询多、增删少用ArrayList;频繁头尾增删、极少查询用LinkedList。日常开发90%场景优先ArrayList。2.ArrayList扩容机制详细说一下?JDK1.8及以上版本:创建空参ArrayList时,初始是空数组,不会直接初始化10个容量,节省内存第一次添加元素时,初始化容量为10当元素个数达到容量上限,触发扩容,新容量=原容量+原容量/2(1.5倍扩容)扩容时会创建新数组,通过数组拷贝将旧元素迁移到新数组3.ArrayList为什么线程不安全?怎么解决?不安全原因:多线程同时添加元素时,会出现覆盖写入、元素缺失、数组越界异常。具体场景:两个线程同时判断容量充足,同时执行赋值操作,后一个线程会覆盖前一个线程的元素,导致数据丢失。解决方案:使用Vector(效率低,不推荐)使用Collections.synchronizedList包装并发场景优先使用CopyOnWriteArrayList(读写分离,读不加锁、写加锁)三、Set集合高频题1.HashSet去重原理?为什么重写equals必须重写hashCode?HashSet底层基于HashMap实现,添加元素时,先调用对象的hashCode()计算哈希值,确定数组存储位置。如果该位置无元素,直接存入;如果有元素,再调用equals()比较内容:equals返回true:判定元素重复,不存储equals返回false:判定哈希冲突,以链表/红黑树形式挂载重写规则:如果只重写equals不重写hashCode,两个内容相同的对象,哈希值大概率不同,会被判定为不同元素,导致去重失效。2.HashSet、LinkedHashSet、TreeSet区别?HashSet:无序、不重复,底层HashMap,查询存储效率最高LinkedHashSet:存取有序、不重复,底层有序哈希表,保留元素添加顺序TreeSet:自然排序、不重复,底层TreeMap,可自定义排序规则四、Map集合核心高频题(面试重点)1.HashMap底层原理(JDK1.8)HashMap底层是数组+链表+红黑树的复合结构,核心流程:通过key的hashCode计算哈希值,经过扰动算法优化,减少哈希冲突通过哈希值对数组长度取模,确定元素在数组中的下标下标位置无元素,直接存入下标位置有元素,产生哈希冲突,挂载链表当链表长度>=8且数组容量>=64,链表转为红黑树,提升查询效率当红黑树节点数量<=6,重新退化为链表2.HashMap初始容量、扩容阈值、加载因子是多少?默认初始容量:16(必须是2的幂次方)默认加载因子:0.75扩容阈值:容量*加载因子=12,元素数量达到12时触发扩容扩容机制:每次扩容为原容量的2倍加载因子0.75是时间和空间的平衡:过小浪费空间,过大哈希冲突增多、查询变慢。3.HashMap为什么线程不安全?JDK1.7和1.8不安全区别?JDK1.7:多线程扩容时会出现链表环形引用,导致死循环,同时会丢失数据。JDK1.8:优化了扩容方式,解决了死循环问题,但依旧不安全,多线程put时会出现数据覆盖、元素丢失。并发场景替代方案:ConcurrentHashMap。4.HashMap和ConcurrentHashMap区别?HashMap:线程不安全,适合单线程场景,效率高ConcurrentHashMap:线程安全,JDK1.8采用CAS+synchronized锁,锁粒度细化到节点,并发性能高,适合多线程场景5.HashMap和Hashtable区别?线程安全:Hashtable线程安全(全局锁),HashMap不安全null值:Hashtable不允许key、value为null;HashMap允许一个key为null,多个value为null扩容:Hashtable扩容2倍+1;HashMap扩容2倍效率:Hashtable全局锁,并发效率极低,基本废弃不用6.LinkedHashMap和TreeMap区别?LinkedHashMap:基于HashMap,保留元素插入顺序,可实现LRU缓存策略TreeMap:基于红黑树,按键自然排序或自定义排序,适合需要有序存储的场景五、集合遍历与坑点实操题(面试高频挖坑题)1.集合遍历方式有几种?各自优缺点?普通for循环:有索引,可修改删除元素,适合List增强for循环:代码简洁,底层迭代器,遍历中不能增删元素,会报并发修改异常Iterator迭代器:支持遍历过程中安全删除元素,通用性强Stream流式遍历:代码简洁,支持链式操作、筛选排序,适合数据处理2.为什么增强for循环遍历集合时不能删除元素?增强for底层依赖迭代器,集合内部维护一个修改次数modCount。遍历过程中如果直接调用集合的remove方法,会修改modCount,而迭代器的预期次数expectedModCount不变,两者不相等,直接抛出ConcurrentModificationException并发修改异常。正确做法:使用迭代器自带的remove方法。3.什么是快速失败(fail-fast)和安全失败(fail-safe)?快速失败:遍历过程中检测到集合被修改,直接抛异常。常见于ArrayList、HashMap等普通集合,避免脏数据。安全失败:遍历基于原集合的副本,遍历过程中修改原集合不会抛异常。常见于CopyOnWriteArrayList、ConcurrentHashMap,缺点是遍历的数据不是实时最新的。六、进阶场景题(二三面常问)1.工作中HashMap怎么优化?初始化时指定预估容量,避免频繁扩容(预估容量=元素数量/0.75+1)重写对象hashCode和equals方法,保证键值去重准确高并发场景用ConcurrentHashMap替代HashMap尽量用不可变对象作为key,避免哈希值变化导致数据丢失2.怎么用LinkedHashMap实现LRU缓存?LinkedHashMap提供了removeEldestEntry方法,重写该方法,设置最大缓存容量。当元素数量超过容

温馨提示

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

评论

0/150

提交评论