目录

一、集合框架的顶层设计:接口与层次

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)
需要频繁在头尾增删元素 ListQueueDeque LinkedList 或 ArrayDeque 链表增删快,ArrayDeque作队列更高效
只需要存储不重复元素 Set HashSet 去重且查询效率最高
需要去重且保持插入顺序 Set LinkedHashSet HashSet + 维护插入顺序
需要元素自动排序 Set TreeSet 基于红黑树实现排序
需要实现队列/栈 Queue/Deque ArrayDeque 效率高,无容量限制
需要优先级处理 Queue PriorityQueue 基于堆实现优先级

总结原则

  1. 默认选择ArrayList (List), HashSet (Set), ArrayDeque (Queue/Stack)。

  2. 线程安全:上述集合均非线程安全。多线程环境下应使用Collections.synchronizedXXX()包装器或java.util.concurrent包下的并发集合(如CopyOnWriteArrayListConcurrentHashMap)。

更多推荐