Java集合全解析:体系架构+分类详解+底层原理+使用场景
前言
Java集合框架是Java开发必须掌握的核心基础,也是面试高频考点、日常编码最常用工具。相比于固定长度的数组,集合具备动态扩容、丰富API、多种数据结构实现等优势,能满足各类数据存储需求。
很多新手甚至初中级开发者,对Java集合体系混乱不清,分不清各个集合的特点、区别与选型。本文将系统化梳理Java所有集合类,搭配架构流程图、分类表格、原理详解,带你一篇吃透Java集合。
一、Java集合整体架构:顶层设计
1.1 集合两大核心体系
Java集合全部位于java.util包下,分为两大独立体系,无继承关系:
- Collection 单列集合:存储单个对象(元素)
- Map 双列集合:存储键值对(Key-Value)
1.2 集合完整体系架构流程图
1.3 三大顶层接口特性
| 接口 | 结构 | 有序性 | 重复性 | 核心作用 |
|---|---|---|---|---|
| Collection | 单列 | 依实现而定 | 依实现而定 | 存储单个对象 |
| List | 单列 | 插入有序 | 可重复 | 按索引操作数据 |
| Set | 单列 | 无序/排序 | 不可重复 | 元素去重 |
| Map | 双列 | 依实现而定 | Key唯一 | 键值对映射 |
二、List集合:有序、可重复、索引访问
List是开发中最常用的集合,特点:插入有序、可重复、有索引、随机访问快。
2.1 ArrayList:动态数组实现
- 底层结构:Object[] 动态数组
- 默认容量:10,扩容1.5倍
- 线程安全:不安全
- 优点:查询快、遍历快、内存占用小
- 缺点:中间增删慢、需要扩容移位
- 适用场景:读多写少,单线程首选List
2.2 LinkedList:双向链表实现
- 底层结构:双向链表
- 线程安全:不安全
- 优点:头尾增删极快、无需扩容
- 缺点:查询慢、占用内存大
- 适用场景:频繁增删、队列/栈场景
2.3 Vector:线程安全数组
- 底层结构:动态数组
- 线程安全:
synchronized加锁 - 缺点:性能极差、已废弃
- 替代方案:CopyOnWriteArrayList
2.4 Stack:栈结构
- 继承Vector,后进先出(LIFO)
- 废弃,推荐用 ArrayDeque
三、Set集合:无序、不可重复、去重专用
Set集合核心特点:不允许重复元素,无索引,依赖hashCode()和equals()去重。
3.1 HashSet:哈希表实现
- 底层:HashMap(Key存元素)
- 特点:无序、去重、查询快
- 线程安全:不安全
- 场景:快速去重、不关心顺序
3.2 LinkedHashSet:哈希表+双向链表
- 底层:LinkedHashMap
- 特点:保持插入顺序、去重
- 场景:去重且需要保证顺序
3.3 TreeSet:红黑树实现
- 底层:TreeMap
- 特点:自动排序(自然排序/比较器)
- 场景:去重+自动排序
四、Queue集合:队列、先进先出
Queue遵循FIFO(先进先出),常用于任务排队、消息队列。
4.1 ArrayDeque:数组双端队列
- 底层:动态数组
- 性能:优于LinkedList
- 场景:队列、栈(推荐使用)
4.2 PriorityQueue:优先级队列
- 底层:最小堆
- 特点:按优先级排序,而非插入顺序
- 场景:优先级调度、TopN 问题
五、Map集合:键值对存储、Key唯一
Map存储Key-Value键值对,Key唯一不可重复,Value可重复。
5.1 HashMap:最常用Map
- 底层:JDK1.8+ 数组+链表+红黑树
- 默认容量:16,负载因子0.75
- 线程安全:不安全
- 允许null:Key和Value都允许null
- 场景:绝大多数键值对业务
5.2 LinkedHashMap:有序Map
- 底层:HashMap+双向链表
- 特点:保持插入顺序/访问顺序
- 场景:缓存(LRU)、有序映射
5.3 TreeMap:排序Map
- 底层:红黑树
- 特点:Key自动排序
- 场景:需要按Key排序的业务
5.4 Hashtable:线程安全Map
- 特点:
synchronized加锁、不允许null - 缺点:性能差、已废弃
- 替代:ConcurrentHashMap
5.5 Properties:配置文件专用
- 继承Hashtable
- Key/Value:只支持String
- 场景:读取
.properties配置文件
六、JUC并发安全集合:多线程专用
普通集合线程不安全,并发场景必须使用JUC(java.util.concurrent)包下的安全集合:
- CopyOnWriteArrayList:读多写少并发List
- CopyOnWriteArraySet:线程安全去重Set
- ConcurrentHashMap:高并发Map(首选)
- ConcurrentLinkedQueue:无锁并发队列
七、集合快速选型流程图(开发必备)
八、所有常用集合核心对比表
| 集合 | 底层 | 有序 | 重复 | 线程安全 | 核心优势 |
|---|---|---|---|---|---|
| ArrayList | 数组 | 插入有序 | 可重复 | 否 | 查询最快 |
| LinkedList | 双向链表 | 插入有序 | 可重复 | 否 | 增删最快 |
| HashSet | HashMap | 无序 | 不可 | 否 | 去重快 |
| LinkedHashSet | LinkedHashMap | 插入有序 | 不可 | 否 | 去重+保序 |
| TreeSet | 红黑树 | 排序 | 不可 | 否 | 排序+去重 |
| HashMap | 数组+链表+红黑树 | 无序 | Key唯一 | 否 | 综合性能最优 |
| LinkedHashMap | HashMap+链表 | 插入有序 | Key唯一 | 否 | 保序Map |
| TreeMap | 红黑树 | Key排序 | Key唯一 | 否 | 排序Map |
| ConcurrentHashMap | 分段锁+CAS | 无序 | Key唯一 | 是 | 高并发Map |
九、集合开发选型终极口诀
- 普通读多写少→ ArrayList
- 频繁增删→ LinkedList / ArrayDeque
- 去重无序→ HashSet
- 去重保序→ LinkedHashSet
- 去重排序→ TreeSet
- 普通键值对→ HashMap
- 有序键值对→ LinkedHashMap
- 多线程并发→ ConcurrentHashMap / CopyOnWriteArrayList
十、总结
- Java集合分为Collection单列和Map双列两大体系;
- List保证有序可重复,Set保证不可重复,Map存储键值对;
- 底层数据结构决定集合性能(数组查询快、链表增删快、红黑树排序快);
- 单线程用普通集合,多线程必须用JUC并发集合;
- 选型依据:有序性、重复性、读写比例、并发场景。
关键点回顾
- Collection:List(有序可重复)、Set(不可重复)、Queue(队列)
- Map:HashMap(常用)、TreeMap(排序)、LinkedHashMap(有序)
- 并发集合:ConcurrentHashMap、CopyOnWriteArrayList
- 核心选型:看顺序、看去重、看性能、看线程安全
