目录

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

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://www.pswp.cn/bicheng/96966.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96966.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96966.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“计算机基础、软件工程、设计模式、数据结构算法、操作系统、数据库、网络、法律法规”是计算机领域从基础理论到工程实践

“计算机基础、软件工程、设计模式、数据结构算法、操作系统、数据库、网络、法律法规”是计算机领域从基础理论到工程实践、再到合规规范的核心知识体系,覆盖了软件开发、系统架构、技术合规等关键维度。以下将对每个领域进行系统拆解,包括核心内容、学…

利用Rancher平台搭建Swarm集群

一、Rancher概述1、rancher平台Rancher是一个开源的企业级容器管理平台,它可以帮助企业在生产环境中轻松快捷地部署和管理容器,也可以轻松管理各种环境的Kubernetes,并提供对DevOps的支持。Rancher目前已经具备全栈化一键部署应用、各种编排调…

Debezium日常分享系列之:MongoDB 新文档状态提取

Debezium日常分享系列之:MongoDB 新文档状态提取变更事件结构行为配置数组编码嵌套结构展平MongoDB $unset 处理确定原始操作添加元数据字段选择性应用转换的选项配置选项已知限制Debezium MongoDB 连接器会发出数据变更消息,以表示 MongoDB 集合中发生的…

OpenCV:图像透视变换

文章目录一、透视变换是什么?二、透视变换的核心原理1. 关键概念:透视变换矩阵2. 核心条件:4对对应点三、OpenCV实现透视变换的关键步骤步骤1:读取并预处理图像步骤2:寻找目标物体的4个顶点步骤3:计算透视变…

commons-csv

maven依赖<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-csv --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId><version>1.14.1</version></dependency…

LeetCode 1446.连续字符

给你一个字符串 s &#xff0c;字符串的「能量」定义为&#xff1a;只包含一种字符的最长非空子字符串的长度。 请你返回字符串 s 的 能量。 示例 1&#xff1a; 输入&#xff1a;s “leetcode” 输出&#xff1a;2 解释&#xff1a;子字符串 “ee” 长度为 2 &#xff0c;只包…

CTFHub SSRF通关笔记9:302跳转 Bypass 原理详解与渗透实战

目录 一、SSRF与302跳转 1、SSRF 2、302响应 3、SSRF与302结合 &#xff08;1&#xff09;SSRF源码分析 &#xff08;2&#xff09;攻击链条&#xff08;Flow of Exploit&#xff09; 二、渗透实战 1、打开靶场 2、尝试127.0.0.1访问 3、file协议分析源码 &#xff…

Windows-Use实战:AI驱动的Windows自动化

Windows-Use实战:AI驱动的Windows自动化 前言 项目介绍与准备工作 Windows-Use是什么? 系统要求 必需环境 步骤一:安装Python和基础环境 1.1 安装Python 检查Python版本 Python安装步骤 1.2 创建项目目录 步骤二:安装Windows-Use 2.1 使用pip安装(推荐) 步骤三:运行和基…

STM32-FreeRTOS操作系统-二值信号量与计数信号量

引言在嵌入式开发领域&#xff0c;任务同步与通信是系统稳定运行的核心。STM32配合FreeRTOS操作系统&#xff0c;为开发者提供了强大的工具支持。其中&#xff0c;二值信号量和计数信号量作为FreeRTOS的关键同步机制&#xff0c;分别用于任务间的简单同步和资源计数控制。二值信…

MarTech营销技术全景解析:概念、图谱与最新实践案例

一、引言&#xff1a;为什么企业越来越依赖MarTech&#xff1f;在数字化浪潮下&#xff0c;企业营销环境正发生深刻变化&#xff1a;客户触点增加&#xff1a;从官网、社交媒体到短视频、展会&#xff0c;信息渠道呈指数级增长。决策链条复杂&#xff1a;B2B客户通常需要多轮调…

服务器 - 从一台服务器切换至另一台服务器(损失数十条访客记录)

服务器 - 从一台服务器切换至另一台服务器(损失数十条PV记录为代价) 看着四年的服务器正式到期&#xff0c;没什么轰轰烈烈的告别&#xff0c;就像目送老朋友转身走远&#xff0c;只默默记下&#xff1a;哦&#xff0c;原来它陪了我这么久啊。 前言 一台陪伴了我4年的服务器昨…

《云原生边缘与AI训练场景:2类高频隐蔽Bug的深度排查与架构修复》

在云原生技术向边缘计算与AI训练场景渗透的过程中&#xff0c;基础设施层的问题往往会被场景特性放大——边缘环境的弱网络、异构硬件&#xff0c;AI训练的高资源依赖、分布式协作&#xff0c;都可能让原本隐藏的Bug以“业务故障”的形式爆发。这些问题大多不具备直观的报错信息…

【51单片机】【protues仿真】基于51单片机数控直流稳压电源系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、数码管显示输出电压值 2、滑动电阻调节输出电压 3、电压输出范围0-15V&#xff0c;步进值1 二、使用步骤 基于51单片机的数控直流稳压电源是一种通过数字控制实现电压调节的智…

xtuoj Rectangle

题目思路将矩形间的相交情况通过投影转化为x、y两个方向下的线段是否相交&#xff0c;即前面的题目&#xff0c;判断两个区间是否相交&#xff0c;x投影的每个区间的左端点是每个矩形x的min&#xff0c;右端点是每个矩形的x的max&#xff0c;y投影情况同理&#xff0c;只要x轴的…

【深度学习踩坑实录】从 Checkpoint 报错到 TrainingArguments 精通:QNLI 任务微调全流程复盘

作为一名深度学习初学者&#xff0c;最近在基于 Hugging Face Transformers 微调 BERT 模型做 QNLI 任务时&#xff0c;被Checkpoint 保存和TrainingArguments 配置这两个知识点卡了整整两天。从磁盘爆满、权重文件加载报错&#xff0c;到不知道如何控制 Checkpoint 数量&#…

Java面试小册(3)

21【Q】: 什么是Java的SPI机制&#xff1f;【A】&#xff1a;SPI 是一种插件机制&#xff0c;用于在运行时动态加载服务的实现。它通过定义接口&#xff08;服务接口&#xff09;并提供一种可扩展的方式来让服务的提供着&#xff08;实现类&#xff09;在运行时注入&#xff0c…

P1150 Peter 的烟

记录20#include <bits/stdc.h> using namespace std; int main(){int n,k;cin>>n>>k;int cnt0;while(n>k){cntk;nn-k1;}cntn;cout<<cnt;return 0; }突破口每吸完一根烟就把烟蒂保存起来&#xff0c;k&#xff08;k>1&#xff09;个烟蒂可以换一个…

Cursor和Hbuilder用5分钟开发微信小程序

分享一个5分钟搞定微信小程序开发的技能&#xff0c;需要用到两个工具&#xff1a;Cursor和Hbuilder。 第1步、下载HBuilder。Hbuilder可以实现一套代码直接生成安卓、苹果、鸿蒙各个平台APP。访问Hbuilder的官方网站&#xff0c;HBuilderX-高效极客技巧&#xff0c;选择适合…

k8s的dashboard

找一个装有docker的机器&#xff0c;在一个rocky linux的虚拟机里弄拉取一个rancher镜像建立一个目录&#xff0c;目的&#xff1a;和里面数据做持久化关联后台运行&#xff0c;让他有权限&#xff0c;8080端口和容器80端口映射&#xff0c;443和443做映射查看一下删掉&#xf…

桥接模式,打造灵活可扩展的日志系统C++

一、为什么用桥接模式在企业开发中&#xff0c;日志系统几乎是标配。常见需求&#xff1a;日志有多种类型&#xff08;Info、Warning、Error 等&#xff09;&#xff1b;日志需要支持多种输出方式&#xff08;控制台输出、写文件、远程上传、数据库存储等&#xff09;。如果把这…