目录
一、集合框架的顶层设计:接口与层次
1. 两大核心接口:Collection 和 Map
2. Collection接口的三大派系
二、核心实现类详解
1. List家族实现
2. Set家族实现
3. Queue/Deque家族实现
PriorityQueue:
ArrayDeque:
三、如何选择正确的集合?
总结原则:
Java集合框架(Java Collections Framework, JCF)是一个用于表示和操作集合的统一架构。它封装了各种经典的数据结构,提供了了一系列接口、实现和算法,极大地提高了开发效率和数据处理的灵活性。
一、集合框架的顶层设计:接口与层次
集合框架的核心围绕着一组清晰的接口展开,这种“面向接口编程”的设计使得算法和数据结构解耦,非常灵活。
1. 两大核心接口:Collection
和 Map
首先必须明确,Java集合分为两大家族:
-
Collection
:存储单一元素的集合。它有三个主要的子接口。 -
Map
:存储键值对(Key-Value)的集合。它自成体系。
(由于您问的是Collection,我们主要聚焦于此,但会简要对比Map以形成完整认知)。
2. Collection接口的三大派系
Collection
接口下主要有三个子接口,定义了三种不同的集合特性:
-
List
(列表) - 有序、可重复-
核心特征:元素有明确的顺序(插入顺序),可以通过索引(下标)精确访问元素,且允许存储重复元素。
-
好比:一个动态数组。
-
-
Set
(集) - 无序、不可重复-
核心特征:不允许包含重复元素。最多包含一个
null
元素。大多数实现不保证维护元素的顺序。 -
好比:数学中的“集合”概念。
-
-
Queue
(队列) - 先进先出(FIFO) / 优先级队列-
核心特征:用于在处理之前保存元素的集合。除了基本的收集功能,还提供了额外的插入、提取和检查操作。
-
子接口:
Deque
(双端队列),支持在两端插入和移除元素。 -
好比:现实中的排队。
-
为了更直观地理解这个层次结构,下图描绘了Collection集合框架的核心接口与实现类之间的关系:
二、核心实现类详解
光有接口不够,我们需要看它们的具体实现。上述图表中列出的实现类,是我们在日常开发中最常打交道的对象。
1. List家族实现
-
ArrayList
:-
底层结构:动态数组。
-
特点:查询快(随机访问),增删慢。因为基于数组,通过索引查询的时间复杂度是O(1);但在中间插入或删除元素需要移动后续所有元素,效率是O(n)。
-
适用场景:读多写少,需要频繁根据索引访问元素的场景。
-
-
LinkedList
:-
底层结构:双向链表。
-
特点:增删快,查询慢。在链表头尾增删元素效率很高O(1),但在指定位置插入或查询需要遍历链表,效率是O(n)。
-
额外功能:实现了
Deque
接口,可以被用作栈、队列或双端队列。 -
适用场景:写多读少,需要频繁在头部和尾部进行插入删除操作的场景。
-
-
Vector
(已过时):-
与
ArrayList
类似,但它是线程安全的(方法上用synchronized
修饰)。 -
因其性能差,已被
Collections.synchronizedList()
和JUC
包下的并发容器(如CopyOnWriteArrayList
)取代。
-
2. Set家族实现
-
HashSet
:-
底层结构:基于
HashMap
,只使用了Key来存储元素,Value是一个固定的Object对象。 -
特点:无序,查询效率非常高(O(1))。它是最常用的Set。
-
原理:通过元素的
hashCode()
和equals()
方法来判断是否重复。
-
-
LinkedHashSet
:-
HashSet
的子类。 -
特点:在
HashSet
的基础上,维护了一个双向链表来记录插入顺序。即迭代顺序与插入顺序一致。 -
适用场景:既需要去重,又需要保证插入顺序。
-
-
TreeSet
:-
底层结构:基于
TreeMap
(红黑树)。 -
特点:元素有序(不是插入顺序,而是根据元素的自然顺序或提供的
Comparator
进行排序)。 -
适用场景:需要对元素进行自动排序的场景。
-
3. Queue/Deque家族实现
-
PriorityQueue
:-
特点:优先级队列。元素根据自然顺序或Comparator进行排序,出队总是按优先级最高(值最小)的顺序。
-
底层结构:通常基于二叉堆实现。
-
适用场景:任务调度等需要按优先级处理的场景。
-
-
ArrayDeque
:-
特点:基于动态数组实现的双端队列。效率高于
LinkedList
,且没有容量限制。 -
适用场景:作为栈(替代老旧的
Stack
类)或队列使用。是实现FIFO队列和LIFO栈的首选。
-
三、如何选择正确的集合?
选择集合的核心在于根据业务场景权衡其底层数据结构的特性。
场景 | 首选接口 | 推荐实现类 | 理由 |
---|---|---|---|
需要根据索引快速访问 | List | ArrayList | 随机访问性能O(1) |
需要频繁在头尾增删元素 | List , Queue , Deque | LinkedList 或 ArrayDeque | 链表增删快,ArrayDeque 作队列更高效 |
只需要存储不重复元素 | Set | HashSet | 去重且查询效率最高 |
需要去重且保持插入顺序 | Set | LinkedHashSet | HashSet + 维护插入顺序 |
需要元素自动排序 | Set | TreeSet | 基于红黑树实现排序 |
需要实现队列/栈 | Queue /Deque | ArrayDeque | 效率高,无容量限制 |
需要优先级处理 | Queue | PriorityQueue | 基于堆实现优先级 |
总结原则:
-
默认选择:
ArrayList
(List),HashSet
(Set),ArrayDeque
(Queue/Stack)。 -
线程安全:上述集合均非线程安全。多线程环境下应使用
Collections.synchronizedXXX()
包装器或java.util.concurrent
包下的并发集合(如CopyOnWriteArrayList
,ConcurrentHashMap
)。