一文认识 Java 常见集合(Java Collections Framework 核心速览,2025–2026 视角)
Java 集合框架(JDK 1.2 引入,至今仍是日常开发最核心的部分)主要解决:动态存储一组对象的问题,比数组更灵活。
两大分支:
- Collection ← 单元素集合(List、Set、Queue)
- Map ← 键值对集合(独立分支,不继承 Collection)
核心对比表格(最常用实现)
| 集合类型 | 接口 | 是否有序 | 是否允许重复 | 是否线程安全(JDK内置) | 底层数据结构 | 随机访问效率 | 插入/删除效率 | 主要使用场景 | 代表实现类 |
|---|---|---|---|---|---|---|---|---|---|
| List | List | 有序 | 允许 | 否(Vector 除外) | 动态数组 / 双向链表 | O(1) / O(n) | 末尾 O(1) / 中间 O(n) | 需要索引访问、频繁随机读写 | ArrayList(首选)、LinkedList、Vector |
| Set | Set | 无序/有序 | 不允许 | 否(少数除外) | 哈希表 / 红黑树 | – | O(1) / O(log n) | 去重、唯一元素集合 | HashSet、LinkedHashSet、TreeSet |
| Queue | Queue / Deque | 有序(FIFO / 双端) | 允许 | 部分(ConcurrentLinkedQueue 等) | 链表 / 数组 / 堆 | – | O(1) | 任务队列、消息队列、先入先出 | PriorityQueue、ArrayDeque、LinkedList |
| Map | Map | 无序/插入序/排序 | key 不重复 | 否(Hashtable 除外) | 哈希表 / 红黑树 | O(1) / O(log n) | O(1) / O(log n) | 键值映射、字典、配置、缓存 | HashMap(首选)、LinkedHashMap、TreeMap |
一图速览继承关系(文字版简化)
Iterable
└─ Collection
├─ List
│ ├─ ArrayList
│ ├─ LinkedList (也实现 Deque)
│ └─ Vector (线程安全,古老)
├─ Set
│ ├─ HashSet
│ ├─ LinkedHashSet (保持插入顺序)
│ └─ SortedSet → NavigableSet → TreeSet (红黑树排序)
└─ Queue
├─ Deque → ArrayDeque、LinkedList
└─ PriorityQueue (小顶堆)
Map (独立)
├─ HashMap
├─ LinkedHashMap (插入/访问顺序)
├─ SortedMap → NavigableMap → TreeMap (红黑树排序)
└─ Hashtable (线程安全,古老)
最常用 8 个集合的详细对比(面试 + 日常必背)
| 集合类 | 底层实现 | 是否允许 null | 线程安全 | 时间复杂度关键点 | 适用场景 & 注意事项 |
|---|---|---|---|---|---|
| ArrayList | 动态数组 | 允许 | 否 | get/set O(1),add/remove 中间 O(n) | 99% 情况下 List 首选,查询多、尾部增删多 |
| LinkedList | 双向链表 | 允许 | 否 | get/set O(n),头尾 add/remove O(1) | 频繁头尾操作、做队列/栈、内存不敏感时用 |
| HashSet | HashMap | 允许 null | 否 | add/contains/remove 平均 O(1),最差 O(n) | 普通去重需求 |
| LinkedHashSet | HashMap + 双向链表 | 允许 null | 否 | 同 HashSet + 保持插入顺序 | 需要去重且保持插入顺序 |
| TreeSet | 红黑树 (TreeMap) | 不允许 null | 否 | add/contains/remove O(log n),天然有序 | 需要排序、范围查询、去重+有序 |
| HashMap | 数组 + 链表/红黑树 | key/value 允许 null | 否 | get/put 平均 O(1),JDK8+ 树化后最差 O(log n) | 普通键值对存储,首选 Map |
| LinkedHashMap | HashMap + 双向链表 | 允许 null | 否 | 同 HashMap + 插入/访问顺序 | LRU 缓存、保持插入顺序 |
| TreeMap | 红黑树 | key 不允许 null | 否 | get/put O(log n),key 有序 | 需要按 key 排序的 Map(如区间统计) |
快速选择口诀(背下来就能少踩坑)
- 需要索引访问 + 尾部操作多 → ArrayList
- 需要频繁头尾增删 → LinkedList(或 ArrayDeque)
- 需要去重 → HashSet(不关心顺序) / LinkedHashSet(要插入顺序) / TreeSet(要排序)
- 需要键值对 → HashMap(不关心顺序) / LinkedHashMap(要顺序或 LRU) / TreeMap(要 key 排序)
- 多线程环境简单粗暴 → Collections.synchronizedXXX() 包装、ConcurrentHashMap(推荐)、CopyOnWriteArrayList/Set(读多写少)
常见面试高频对比问题
- ArrayList vs LinkedList:查询 vs 头尾增删
- HashMap vs TreeMap vs LinkedHashMap:无序 vs 排序 vs 插入顺序
- HashSet 如何保证不重复?(hashCode + equals)
- HashMap JDK7 vs JDK8 区别?(头插法 → 尾插法 + 红黑树)
- ConcurrentHashMap 为什么比 Hashtable 性能好?(分段锁 → CAS + synchronized)
一句话总结:日常 80% 场景用 ArrayList + HashMap + HashSet 就够了,剩下 20% 再根据“顺序、排序、并发、LRU”等特殊需求选其他实现。
有哪一个集合想深入看源码 / 时间复杂度推导 / 面试题?或者想看某个具体场景的代码示例?随时告诉我~