Java中的集合类有哪些?如何分类的?
一则或许对你有用的小广告
欢迎 加入小哈的星球 ,你将获得: 专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目: 《Spring AI 项目实战(问答机器人、RAG 增强检索、联网搜索)》 正在持续爆肝中,基于
Spring AI + Spring Boot3.x + JDK 21..., 点击查看; - 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot3.x + JDK 17..., 点击查看项目介绍; 演示链接: http://116.62.199.48:7070/; - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
面试考察点
-
体系结构认知:面试官不仅仅想知道你能背出几个集合类名,更想考察你是否理解 Java 集合框架的整体设计思想,能否从接口到实现有一个清晰的层次认知。
-
选型能力:考察你是否了解不同集合类的特性差异,能否根据实际场景(有序、唯一、排序、线程安全等)选择合适的实现类。
-
深度与广度:这道题是 "开门题",面试官通常会根据你的回答深入追问某个具体集合的原理,比如
HashMap的扩容机制、ConcurrentHashMap的线程安全实现等。
核心答案
Java 集合框架主要分为 两大体系:Collection 和 Map。
上图展示了 Java 集合框架的整体架构,分为两大核心体系:
-
Collection 体系:存储单列元素,根据特性细分为
List(有序可重复)、Set(无序唯一)、Queue(队列)三大接口。 -
Map 体系:存储键值对(Key-Value),通过 Key 快速查找 Value,Key 必须唯一。
深度解析
一、Collection 体系详解
1. List 接口 - 有序可重复
| 实现类 | 底层结构 | 线程安全 | 特点 | 适用场景 |
|---|---|---|---|---|
ArrayList | 动态数组 | ❌ | 查询 O(1),尾部增删 O(1) | 大多数场景首选 |
LinkedList | 双向链表 | ❌ | 头部增删 O(1),查询 O(n) | 频繁头部增删 |
Vector | 动态数组 | ✅ | 全表 synchronized 锁 | 已淘汰 |
Stack | 动态数组 | ✅ | 继承 Vector,后进先出 | 已淘汰,用 ArrayDeque |
2. Set 接口 - 无序唯一
| 实现类 | 底层结构 | 有序性 | 特点 |
|---|---|---|---|
HashSet | 哈希表 | ❌ 无序 | 性能最高,基于 HashMap |
LinkedHashSet | 哈希表 + 链表 | ✅ 插入有序 | 保持插入顺序 |
TreeSet | 红黑树 | ✅ 排序有序 | 支持自然排序或自定义排序 |
3. Queue 接口 - 队列
| 实现类 | 类型 | 特点 |
|---|---|---|
LinkedList | 双端队列 | 可作为队列、栈、列表使用 |
ArrayDeque | 双端队列 | 循环数组实现,性能优于 LinkedList |
PriorityQueue | 优先队列 | 按优先级出队,非线程安全 |
ArrayBlockingQueue | 阻塞队列 | 有界,线程安全,生产者消费者模型 |
LinkedBlockingQueue | 阻塞队列 | 可选有界/无界,线程安全 |
二、Map 体系详解
| 实现类 | 底层结构 | 线程安全 | null 键/值 | 特点 |
|---|---|---|---|---|
HashMap | 数组 + 链表/红黑树 | ❌ | ✅/✅ | 最常用,性能最高 |
LinkedHashMap | HashMap + 双向链表 | ❌ | ✅/✅ | 保持插入顺序或 LRU 顺序 |
TreeMap | 红黑树 | ❌ | ❌/✅ | 按键排序,支持范围查询 |
Hashtable | 数组 + 链表 | ✅ | ❌/❌ | 全表锁,已淘汰 |
ConcurrentHashMap | 数组 + 链表/红黑树 | ✅ | ❌/❌ | 高并发首选,细粒度锁 |
WeakHashMap | 弱引用哈希表 | ❌ | ✅/✅ | Key 可被 GC 回收 |
三、如何选择合适的集合
四、常见误区
误区一:Vector 和 Hashtable 还在生产使用
// ❌ 错误:使用过时的同步集合
List<String> list = new Vector<>();
Map<String, String> map = new Hashtable<>();
// ✅ 正确:使用并发包中的集合
List<String> list = new CopyOnWriteArrayList<>();
Map<String, String> map = new ConcurrentHashMap<>();
误区二:HashSet 真的 "无序" 吗?
HashSet 的 "无序" 指的是不保证插入顺序,但实际遍历顺序由哈希值决定,在同一次运行中顺序是稳定的。
误区三:LinkedList 比 ArrayList 插入快?
只有在头部插入时 LinkedList 才更快,尾部插入 ArrayList 更快(无指针开销),中间插入两者都是 O(n)。
面试高频追问
-
ArrayList 和 LinkedList 的区别?
- 底层结构、时间复杂度、内存占用、适用场景
-
HashMap 的底层原理?
- 数组 + 链表 + 红黑树,扩容机制,哈希冲突解决
-
ConcurrentHashMap 如何保证线程安全?
- JDK 7 分段锁 vs JDK 8 CAS +
synchronized
- JDK 7 分段锁 vs JDK 8 CAS +
常见面试变体
- "List、Set、Map 三者的区别?"
- "哪些集合是线程安全的?"
- "如何选择使用哪个集合类?"
记忆口诀
Collection 三剑客:
- List:有序可重复,像排队
- Set:无序要唯一,像身份证号
- Queue:先进先出,像排队买票
Map 选择口诀:
- 单线程用
HashMap - 要排序用
TreeMap - 要顺序用
LinkedHashMap - 多线程用
ConcurrentHashMap
总结
Java 集合框架分为 Collection(单列)和 Map(双列)两大体系。Collection 下分 List(有序可重复)、Set(无序唯一)、Queue(队列)三类;Map 存储键值对,核心实现包括 HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap。选型时根据 "有序性、唯一性、线程安全、排序需求" 四个维度判断,日常开发 ArrayList + HashMap 覆盖 90% 场景。