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/

面试考察点

  1. 体系结构认知:面试官不仅仅想知道你能背出几个集合类名,更想考察你是否理解 Java 集合框架的整体设计思想,能否从接口到实现有一个清晰的层次认知。

  2. 选型能力:考察你是否了解不同集合类的特性差异,能否根据实际场景(有序、唯一、排序、线程安全等)选择合适的实现类。

  3. 深度与广度:这道题是 "开门题",面试官通常会根据你的回答深入追问某个具体集合的原理,比如 HashMap 的扩容机制、ConcurrentHashMap 的线程安全实现等。

核心答案

Java 集合框架主要分为 两大体系CollectionMap

上图展示了 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数组 + 链表/红黑树✅/✅最常用,性能最高
LinkedHashMapHashMap + 双向链表✅/✅保持插入顺序或 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)。

面试高频追问

  1. ArrayList 和 LinkedList 的区别?

    • 底层结构、时间复杂度、内存占用、适用场景
  2. HashMap 的底层原理?

    • 数组 + 链表 + 红黑树,扩容机制,哈希冲突解决
  3. ConcurrentHashMap 如何保证线程安全?

    • JDK 7 分段锁 vs JDK 8 CAS + synchronized

常见面试变体

  • "List、Set、Map 三者的区别?"
  • "哪些集合是线程安全的?"
  • "如何选择使用哪个集合类?"

记忆口诀

Collection 三剑客

  • List:有序可重复,像排队
  • Set:无序要唯一,像身份证号
  • Queue:先进先出,像排队买票

Map 选择口诀

  • 单线程用 HashMap
  • 要排序用 TreeMap
  • 要顺序用 LinkedHashMap
  • 多线程用 ConcurrentHashMap

总结

Java 集合框架分为 Collection(单列)和 Map(双列)两大体系。Collection 下分 List(有序可重复)、Set(无序唯一)、Queue(队列)三类;Map 存储键值对,核心实现包括 HashMapLinkedHashMapTreeMapConcurrentHashMap。选型时根据 "有序性、唯一性、线程安全、排序需求" 四个维度判断,日常开发 ArrayList + HashMap 覆盖 90% 场景。