Java 集合八股文面试题

一、Java 集合框架全景概览

Java 集合框架以 Collection 和 Map 为两大核心接口展开,Collection 专注于元素的集合操作(如 List、Set、Queue),Map 专注于键值对的映射关系。先来看一张全景图,建立整体认知:

二、List 接口:ArrayList、LinkedList、Vector 三兄弟的 “爱恨情仇”

1. ArrayList:动态数组的 “速度担当”

  • 底层实现:基于动态数组(数组扩容 + 元素拷贝)。
  • 核心特性
    • 随机查询快(get(index) 时间复杂度 O (1));
    • 插入、删除慢(需要移动元素,时间复杂度 O (n));
  • 扩容机制:初始容量 10,扩容时新容量为原容量的 1.5 倍,通过 Arrays.copyOf() 实现数组拷贝。

2. LinkedList:双向链表的 “灵活选手”

  • 底层实现:基于双向链表(每个节点含 prevnext 指针)。
  • 核心特性
    • 随机查询慢(需遍历链表,时间复杂度 O (n));
    • 插入、删除快(只需修改指针,时间复杂度 O (1));
  • 额外能力:同时实现 Queue 和 Deque 接口,可作为 ** 队列(FIFO)栈(LIFO)** 使用。

3. Vector:线程安全的 “老派选手”

  • 底层实现:基于动态数组,与 ArrayList 结构类似。
  • 线程安全实现:所有公有方法加 synchronized 修饰(方法级同步),保证单个方法的原子性。
  • 缺点:同步粒度粗,性能差;复合操作(如 “检查后删除”)仍需手动加锁。

4. 三者核心区别对比

特性ArrayListLinkedListVector
底层结构动态数组双向链表动态数组
随机访问O (1) 快O (n) 慢O (1) 快
插入 / 删除O (n) 慢O (1) 快O (n) 慢
线程安全不安全不安全安全(方法同步)
扩容机制1.5 倍无(链表无需扩容)2 倍

三、Set 接口:元素去重的 “守卫者”

Set 接口的核心是 “元素不重复”,常用实现类有 HashSet、LinkedHashSet、TreeSet。

1. HashSet:哈希表的 “去重先锋”

  • 底层实现:基于 HashMap(以元素为 key,PRESENT 为固定 value)。
  • 特性:元素无序,不允许重复,允许 null 元素。
  • 去重原理:通过 hashCode() 和 equals() 方法判断元素是否重复(先比较哈希码,再比较内容)。

2. LinkedHashSet:有序的 “哈希表 + 链表”

  • 底层实现:基于 LinkedHashMap,在哈希表基础上维护了一条双向链表
  • 特性:元素有序(插入顺序),不允许重复,允许 null 元素。
  • 应用场景:需要 “去重且保留插入顺序” 的场景(如缓存淘汰策略)。

3. TreeSet:红黑树的 “有序守卫”

  • 底层实现:基于 TreeMap(红黑树结构)。
  • 特性:元素有序(自然顺序或比较器顺序),不允许重复,不允许 null 元素(会破坏排序规则)。
  • 排序原理:元素需实现 Comparable 接口,或在创建时指定 Comparator

四、Map 接口:键值对的 “映射大师”

Map 接口处理 “键值对” 映射关系,核心实现类有 HashMap、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap。

1. HashMap:哈希表的 “性能王者”

  • 底层实现数组 + 链表 + 红黑树(JDK 8 后优化)。
    • 当链表长度 > 8 且数组容量 > 64 时,链表转为红黑树;
    • 当红黑树节点数 < 6 时,红黑树转回链表。
  • 哈希碰撞解决:通过 “链表法”(JDK 7 及之前)和 “链表 + 红黑树”(JDK 8+)解决。
  • 扩容机制:初始容量 16,负载因子 0.75;扩容时新容量为原容量的 2 倍,需重新哈希所有元素。
  • 特性:无序,允许 null 键(仅一个)和 null 值,线程不安全

2. Hashtable:线程安全的 “老派映射”

  • 底层实现:数组 + 链表(无红黑树优化)。
  • 线程安全实现:所有公有方法加 synchronized 修饰(同步粒度为整个对象)。
  • 缺点:性能差,不允许 null 键和 null 值,已被 ConcurrentHashMap 替代。

3. TreeMap:红黑树的 “有序映射”

  • 底层实现:基于红黑树
  • 特性:键有序(自然顺序或比较器顺序),不允许 null 键(破坏排序),允许 null 值,线程不安全。

4. LinkedHashMap:有序的 “哈希表 + 链表”

  • 底层实现:基于 HashMap,额外维护一条双向链表记录插入顺序或访问顺序。
  • 特性:键有序(插入顺序或访问顺序),允许 null 键和 null 值,线程不安全。
  • 应用场景:LRU 缓存(通过访问顺序实现)。

5. ConcurrentHashMap:线程安全的 “现代哈希表”

  • JDK 7 vs JDK 8 区别
    • JDK 7:分段锁(Segment 数组),每个 Segment 是一个小 HashMap,锁粒度为 Segment。
    • JDK 8: CAS + synchronized 锁(锁粒度为数组节点),结构与 HashMap 一致(数组 + 链表 + 红黑树)。
  • 特性:线程安全,性能优于 Hashtable;不允许 null 键和 null 值。

6. HashMap vs Hashtable 核心区别

特性HashMapHashtable
线程安全不安全安全(方法同步)
null 支持允许 null 键值不允许
底层结构数组 + 链表 + 红黑树数组 + 链表
扩容机制2 倍2 倍
迭代器fail-fastfail-safe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值