跳到主要内容

集合框架知识体系概览

什么是集合框架?

集合框架(Java Collections Framework, JCF) 是 Java 提供的一套用于存储和操作数据集合的标准 API。如果说数组是"固定大小的储物柜",那集合就是"可以自动伸缩、按需选择类型的智能容器"。

在实际开发中,你几乎不可能只用数组——从数据库查出一批用户要存到 List、判断用户名是否重复要用 Set、建立 ID 到对象的映射要用 Map。集合框架是 Java 开发者每天都在用的基础设施。


集合框架的整体结构

集合框架有两大根接口:

  • Collection:存储"一组元素",下分 List(有序可重复)、Set(无序不重复)、Queue(队列)
  • Map:存储"键值对",每个 key 唯一

核心知识点

List——有序可重复的列表

实现类底层结构随机访问增删效率线程安全
ArrayList动态数组O(1)O(1) ✅ 快O(n)O(n)
LinkedList双向链表O(n)O(n)O(1)O(1)
Vector动态数组O(1)O(1)O(n)O(n)✅(已过时)
CopyOnWriteArrayList写时复制数组O(1)O(1)O(n)O(n)

ArrayList 是最常用的 List 实现——底层是 Object[] 数组,初始容量 10,扩容时增长为原来的 1.5 倍newCapacity = oldCapacity + (oldCapacity >> 1))。面试高频问题:ArrayList 和 LinkedList 怎么选?绝大多数场景选 ArrayList——现代 CPU 的缓存机制让连续内存访问远快于链表的指针跳转。

Map——键值对映射

HashMap 是 Java 面试中出现频率最高的数据结构,没有之一。

HashMap 底层原理
  • JDK 7:数组 + 链表(头插法,多线程下可能死循环)
  • JDK 8:数组 + 链表 + 红黑树(链表长度 > 8 且数组长度 ≥ 64 时转红黑树,尾插法)

核心参数:初始容量 16、负载因子 0.75、扩容为 2 倍。put 操作的流程是:计算 key 的 hash → 定位桶位置 → 如果桶为空直接放入,不为空则遍历链表/红黑树处理冲突。

ConcurrentHashMap 是 HashMap 的线程安全版本。JDK 7 用分段锁(Segment),JDK 8 改为 CAS + synchronized 锁单个桶节点,并发度大幅提升。

Set——无重复的集合

HashSet 底层就是一个 HashMap(值固定为 PRESENT 常量),利用 HashMap 的 key 唯一性实现去重。判断"重复"依赖 hashCode()equals() 方法——这也是为什么重写 equals 必须同时重写 hashCode

Queue——队列

  • PriorityQueue:基于二叉堆的优先队列,元素按优先级出队,常用于 TopK 问题
  • ArrayDeque:基于循环数组的双端队列,可以用作栈(push/pop)或队列(offer/poll),性能优于 StackLinkedList
  • BlockingQueue:阻塞队列(ArrayBlockingQueueLinkedBlockingQueue),线程池的核心组件

Stream API——函数式集合操作

Java 8 引入的 Stream API 提供了声明式的集合处理方式,支持 filtermapreducecollect 等操作,类似 JavaScript 的数组高阶函数:

// 筛选年龄 > 18 的用户名,按字母排序
List<String> names = users.stream()
.filter(u -> u.getAge() > 18)
.map(User::getName)
.sorted()
.collect(Collectors.toList());

Stream 还支持并行流(Parallel Stream)——自动利用多核 CPU 并行处理,但要注意线程安全和性能开销。


面试重点总结

问题关键点
HashMap 底层原理数组+链表+红黑树、put 流程、扩容机制、hash 计算
HashMap vs HashtableHashtable 线程安全但已过时,用 ConcurrentHashMap
ArrayList vs LinkedListArrayList 几乎总是更好的选择(CPU 缓存友好)
HashMap 线程不安全的表现JDK 7 死循环、JDK 8 数据丢失和 size 不准确
ConcurrentHashMap 原理JDK 7 分段锁 vs JDK 8 CAS + synchronized
fail-fast vs fail-safe遍历时修改集合抛 ConcurrentModificationException

学习建议

推荐学习路径
  1. ArrayList 源码 → 扩容机制、动态数组原理
  2. HashMap 源码 → Java 面试最高频知识点
  3. ConcurrentHashMap → 并发场景下的 Map
  4. TreeMap / PriorityQueue → 红黑树 / 堆的应用
  5. Stream API → 现代 Java 开发必备

相关链接