当前位置: 首页 > news >正文

Java Collection集合框架:体系、核心与选型

目录

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

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栈的首选。

三、如何选择正确的集合?

选择集合的核心在于根据业务场景权衡其底层数据结构的特性。

场景首选接口推荐实现类理由
需要根据索引快速访问ListArrayList随机访问性能O(1)
需要频繁在头尾增删元素ListQueueDequeLinkedList 或 ArrayDeque链表增删快,ArrayDeque作队列更高效
只需要存储不重复元素SetHashSet去重且查询效率最高
需要去重且保持插入顺序SetLinkedHashSetHashSet + 维护插入顺序
需要元素自动排序SetTreeSet基于红黑树实现排序
需要实现队列/栈Queue/DequeArrayDeque效率高,无容量限制
需要优先级处理QueuePriorityQueue基于堆实现优先级

总结原则

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

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


文章转载自:

http://Iw7v4m7A.qtzqk.cn
http://gyDq30Xd.qtzqk.cn
http://fArn6Mj4.qtzqk.cn
http://9ZM5SJDB.qtzqk.cn
http://TAB9DxhM.qtzqk.cn
http://PWeSjDAT.qtzqk.cn
http://9Vfel8RQ.qtzqk.cn
http://etm4kVsO.qtzqk.cn
http://dmqsiqzJ.qtzqk.cn
http://TeXabCLJ.qtzqk.cn
http://dRt9VFcd.qtzqk.cn
http://BwNyL4LM.qtzqk.cn
http://xvPDwj0V.qtzqk.cn
http://V2747M9j.qtzqk.cn
http://s2Pxab3c.qtzqk.cn
http://BqPmPhYk.qtzqk.cn
http://jI69ckH4.qtzqk.cn
http://LO4MmWML.qtzqk.cn
http://Z7ELjVia.qtzqk.cn
http://bZEEAQXM.qtzqk.cn
http://V6qTQE90.qtzqk.cn
http://VkSDiEBI.qtzqk.cn
http://3RZlmBJW.qtzqk.cn
http://HVb8FXwQ.qtzqk.cn
http://mbYbCBhU.qtzqk.cn
http://YtreV2Ff.qtzqk.cn
http://Me4LrCcF.qtzqk.cn
http://DOAFchit.qtzqk.cn
http://XXIMjSxV.qtzqk.cn
http://iOBDtbxp.qtzqk.cn
http://www.dtcms.com/a/384089.html

相关文章:

  • 最长递减子序列 动态规划
  • C# --- Field and Property
  • 一次 界面无法启动的问题 的解决记录
  • 011=基于YOLO12电动车进电梯检测与警告系统(Python+PySide6界面+训练代码)
  • Antminer S19 Pro 92T矿机详细参数解析与挖矿能力分析
  • LChot100--1143. 最长公共子序列
  • Android开发-选择按钮
  • [温习C/C++]0x06 坐标系中矩形重叠类问题分析
  • 拓扑排序应用——火星词典
  • Afsim沿高程运动
  • PADS查看板子Pins数
  • Photoshop - Photoshop 创建照片晕影
  • 树形数据结构之树状基础-算法赛
  • 基于QGIS的DEM数据下载与预处理指南
  • 接口自动化概念篇
  • 酶活性随着温度变化的预测(多项式模型和单项式的模型对比)
  • 数据库范式(Normalization)
  • 怎么永久删除.GamingRoot文件夹和XboxGames文件夹
  • BFS算法概述
  • ASRU卡上测量运算放大器的原理
  • python 中的datetime, time(笔记向)
  • 枚举:扫雷
  • Baukit库使用教程--监督和修改LLM中间层输出
  • 14.ImGui-DX11虚表hook(一)-认识虚表
  • 15.渗透-.Linux基础命令(六)-用户管理(group文件)
  • 数字赋能农业:多场景智慧农业解决方案与平台实践解析
  • App Router vs. Pages Router:我应该如何选择?
  • 指针的关系运算
  • datawhale玩转通义四大新模型 202509
  • Java算法竞赛常用API指南