Java Collection集合框架:体系、核心与选型
目录
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)。
更多推荐


所有评论(0)