java常见的集合框架

news2025/2/28 0:08:44

常见的集合框架

JAVA的集合框架可以分成两类。

  • Collection,主要有List、vector、set、queue

    • List代表有序,可重复的集合,像动态数组ArrayList和链表LinkedList

    • Set代表无序不可重复的集合。像HashSet、TreeSet

    • Queue代表队列,像双端队列ArrayQueue,优先队列PriorityQueue

  • Map,代表键值的键值对,HashMap、LinkedHashMap、TreeMap

  1. Collection 接口相关集合类扩展

    • List 接口

      • ArrayList

        • 内部实现原理:ArrayList 内部是基于数组实现的。它在内存中是一块连续的存储空间,这使得它能够快速地通过索引访问元素,时间复杂度为。例如,当你要获取列表中的第个元素时,底层直接通过计算数组下标偏移量就可以定位到该元素。

        • 动态扩容机制:当向 ArrayList 中添加元素时,如果数组已满,它会自动进行扩容。通常是创建一个更大的新数组,然后将旧数组中的元素复制到新数组中。这个扩容过程会有一定的性能开销,但是 ArrayList 通过合理的扩容策略(例如,每次扩容为原来容量的 1.5 倍左右)来尽量减少这种开销对性能的影响。

        • 适用场景:适用于频繁地通过索引访问元素,以及在列表尾部进行添加和删除操作的场景。比如,在一个数据报表系统中,需要存储一系列按照某种顺序排列的数据记录,并且经常需要根据索引获取特定位置的记录,这时 ArrayList 是一个很好的选择。

      • LinkedList

        • 内部实现原理:LinkedList 是通过链表结构实现的。每个节点包含数据元素、指向前一个节点的引用和指向后一个节点的引用。这种链表结构使得它在插入和删除元素时非常高效,尤其是在列表中间进行操作时。例如,在插入一个新元素时,只需要修改相邻节点的引用即可,时间复杂度为(不考虑查找插入位置的时间)。

        • 遍历方式:由于它不是基于连续的内存存储,所以通过索引访问元素相对较慢,时间复杂度为。但是它提供了双向遍历的功能,既可以从头部开始,也可以从尾部开始遍历链表,这在某些特定的应用场景下非常有用。

        • 适用场景:适合于频繁地在列表中间进行插入和删除操作的场景。比如,在一个任务调度系统中,任务队列中的任务可能会根据优先级或者其他条件频繁地调整顺序,这时 LinkedList 可以更好地满足这种动态操作的需求。

    • Set 接口

      • HashSet

        • 哈希原理的应用:HashSet 是基于哈希表实现的集合。它通过计算元素的哈希值来确定元素在集合中的存储位置,这使得它能够快速地判断元素是否存在于集合中,时间复杂度通常接近。例如,当向 HashSet 中添加一个元素时,首先计算该元素的哈希值,然后根据哈希值找到对应的存储位置,如果该位置没有元素或者已经存在的元素与要添加的元素相同(通过equals方法判断),则添加成功;否则添加失败。

        • 元素的无序性和不可重复性:HashSet 中的元素是无序的,这是因为哈希表的存储位置是根据哈希值计算得到的,不同元素的哈希值可能导致它们在集合中的存储位置没有明显的顺序关系。同时,HashSet 不允许重复元素,这是由其内部的哈希冲突处理机制和equals方法的检查来保证的。

        • 适用场景:适用于需要快速判断元素是否存在,并且不关心元素顺序的场景。比如,在一个用户权限管理系统中,需要存储用户的权限集合,当检查用户是否具有某种权限时,HashSet 可以快速地给出答案。

      • TreeSet

        • 基于树结构的实现:TreeSet 是基于红黑树(一种自平衡二叉搜索树)实现的集合。它通过比较元素的大小(根据元素实现的Comparable接口或者在构造 TreeSet 时传入的Comparator)来确定元素在树中的位置,从而保证集合中的元素是有序的。

        • 排序规则和性能权衡:这种有序性使得 TreeSet 在遍历元素时能够按照一定的顺序输出,例如按照自然顺序或者自定义的比较顺序。但是,由于它是基于树结构实现的,插入和删除元素的操作时间复杂度为,相对 HashSet 在某些情况下可能会慢一些,不过它提供了有序的集合操作功能。

        • 适用场景:适用于需要对元素进行排序并且保证元素唯一性的场景。比如,在一个成绩排名系统中,将学生的成绩存储在 TreeSet 中,可以方便地按照成绩高低输出学生的排名。

    • Queue 接口

      • ArrayQueue(假设你想说的是 ArrayDeque)

        • 双端队列的特性:ArrayDeque 是一个双端队列,它既可以在头部添加和删除元素,也可以在尾部添加和删除元素。内部是通过循环数组实现的,这种实现方式使得它在两端进行操作时都比较高效,时间复杂度为。

        • 扩容机制和边界处理:与 ArrayList 类似,当队列满时,ArrayDeque 会进行扩容。同时,它在处理循环数组的边界问题上有一套巧妙的机制,能够保证元素的正确添加和删除,并且充分利用数组空间。

        • 适用场景:适用于需要在两端频繁操作的场景,比如在一个消息处理系统中,消息可以从头部进入队列进行优先处理,也可以从尾部进入队列按照顺序处理。

      • PriorityQueue

        • 优先级队列的原理:PriorityQueue 是一个优先级队列,它根据元素的优先级来决定元素的出队顺序。内部是通过堆(通常是二叉堆)结构实现的,堆顶元素是优先级最高的元素。当插入一个新元素时,会根据优先级调整元素在堆中的位置,时间复杂度为。

        • 优先级的定义和比较方式:元素的优先级是通过元素实现的Comparable接口或者在构造 PriorityQueue 时传入的Comparator来定义的。例如,在一个任务调度系统中,任务可以根据紧急程度定义优先级,PriorityQueue 可以保证紧急程度高的任务先被处理。

        • 适用场景:适用于需要按照一定的优先级顺序处理元素的场景,如操作系统中的进程调度、网络中的数据包处理等。

  2. Map 接口相关集合类扩展

    • HashMap

      • 哈希表的核心实现:HashMap 是基于哈希表实现的键值对集合。它通过对键进行哈希计算来确定键值对在集合中的存储位置,这使得它能够快速地进行查找、插入和删除操作,时间复杂度通常接近。例如,当要查找一个键对应的键值对时,首先计算键的哈希值,然后根据哈希值找到对应的存储位置,再通过键的比较(equals方法)来确定是否找到目标键值对。

      • 哈希冲突的处理方式:在哈希计算过程中,可能会出现不同的键具有相同的哈希值的情况,这就是哈希冲突。HashMap 采用了链地址法来处理哈希冲突,即将具有相同哈希值的键值对存储在一个链表(在 Java 8 及以后,如果链表长度超过一定阈值,会转换为红黑树以提高性能)中。

      • 适用场景:适用于需要快速查找、插入和删除键值对,并且键值对的顺序不重要的场景。比如,在一个缓存系统中,将缓存数据以键值对的形式存储在 HashMap 中,键是缓存的标识符,值是缓存的数据内容。

    • LinkedHashMap

      • 链表与哈希表的结合:LinkedHashMap 是 HashMap 的子类,它在 HashMap 的基础上,通过一个双向链表来维护键值对的插入顺序或者访问顺序。这使得它既具有 HashMap 的高效查找性能,又能够按照一定的顺序遍历键值对。

      • 顺序的维护方式和应用场景:如果是按照插入顺序维护,那么每次插入新的键值对时,会将其添加到链表的尾部;如果是按照访问顺序维护,在访问一个键值对后,会将其移动到链表的尾部。这种有序性在一些需要记录操作顺序或者数据访问顺序的场景中非常有用。例如,在一个网页浏览器的历史记录管理中,可以使用 LinkedHashMap 来存储访问过的网页链接,按照访问顺序进行存储,方便用户查看历史记录。

    • TreeMap

      • 基于树结构的有序映射:TreeMap 是基于红黑树实现的键值对集合,它根据键的大小关系(通过键实现的Comparable接口或者在构造 TreeMap 时传入的Comparator)来确定键值对在树中的位置,从而保证键值对是按照一定的顺序存储的。

      • 性能特点和应用场景:TreeMap 的插入、删除和查找操作时间复杂度为,它提供了按照键的顺序进行遍历的功能,适用于需要对键值对进行排序,并且需要在有序的环境下进行查找、插入和删除操作的场景。比如,在一个字典应用中,将单词作为键,单词的解释作为值存储在 TreeMap 中,这样可以方便地按照字母顺序查找单词的解释。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

期末速成C++【类和对象】

目录 1.面向对象的编程思想 2.面向对象的三大特征 3.封装 4.类的定义 5.成员函数 6.对象的创建和使用 7.字符串string的使用 8.this指针 9.构造函数VS析构函数 9.1🎇构造函数 9.1.1无参构造函数&有参构造函数​ 9.1.2构造函数的初始化表 9.1.3重…

牛客周赛 Round 72 <字符串>

<1>小红的01串&#xff08;一&#xff09; #include<stdio.h> #include<string.h> char ch[100]; int main() {scanf("%s",ch);int count0;int lenstrlen(ch);for(int i0;i<len-1;i){if(ch[i]!ch[i1]){count;} }printf("%d",count);…

2024.12.14 TCP/IP 网络模型有哪几层?

2024.12.14 TCP/IP 网络模型有哪几层? 2024.12.14 今天周六 看到大伙都在考六级&#xff0c;我来复盘小林coding的计算机网络的知识点&#xff1a; TCP/IP 网络模型有哪几层? 问大家&#xff0c;为什么要有 TCP/IP 网络模型? 对于同一台设备上的进程间通信&#xff0c;有…

将 Ubuntu 22.04 LTS 升级到 24.04 LTS

Ubuntu 24.04 LTS 将支持 Ubuntu 桌面、Ubuntu 服务器和 Ubuntu Core 5 年&#xff0c;直到 2029 年 4 月。 本文将介绍如何将当前 Ubuntu 22.04 系统升级到最新 Ubuntu 24.04 LTS版本。 备份个人数据 以防万一&#xff0c;把系统中的重要数据自己备份一下~ 安装配置SSH访问…

商业化大前端在性能优化领域的探索与实践

导读&#xff1a;在业务飞速发展的过程中&#xff0c;用户体验是必不可少的一个环节&#xff0c;而页面性能是直接影响用户体验的重要因素。当页面加载时间过长、交互操作不流畅时&#xff0c;意味着业务可能会出现转化率降低、用户流失等业务问题。在过去一年&#xff0c;为了…

Envoy 进阶指南(下):深入探究Envoy服务和架构

接上篇&#xff1a;《Envoy 进阶指南&#xff08;上&#xff09;&#xff1a;从入门到核心功能全掌握》 链接 文章目录 3.深入探究Envoy3.1 Envoy服务发现机制3.1.1文件订阅3.1.2 gRPC 流式订阅3.1.3 REST-JSON 轮询订阅 3.2监听器&#xff08;Listener&#xff09;3.3.架构3.3…

将PDF流使用 canvas 绘制展示在页面上(一)

将PDF流展示在页面上 使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上进行绘制展示 安装 pdfjs-dist 依赖 npm install pdfjs-dist 或者 yarn add pdfjs-dist创建一个组件来处理 PDF 流的加载和渲染 该组件中是一个包含 PDF 文件的 Base64。 将 pdf 流传入该组件中使用 /** fo…

PCIE概述

PCIE概述 文章目录 PCIE概述前言一、应用场景二、PCIE理论2.1 硬件2.2 拓扑结构&#xff1a;处理器和设备之间的关系2.3 速率2.4 层次接口2.5 四种请求类型2.5.1 bar空间2.5.2 memory2.5.3 IO2.5.4 configuration2.5.5 message 前言 参考链接&#xff1a; pcie总线知识点解析 …

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络&#xff08;RNN&#xff09;1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN&#xff08;1&#xff09;RNN实例化&#xff08;2&#xff09;forward函数&#xff08;3&#xf…

Elasticsearch8.17.0在mac上的安装

1、下载并安装 下载8.17版本es(目前最新版本)&#xff1a;Download Elasticsearch | Elastic 也可以通过历史版本列表页下载&#xff1a;Past Releases of Elastic Stack Software | Elastic 当然也可以指定具体版本号进行下载&#xff1a;Elasticsearch 8.17.0 | Elastic …

【自动控制原理】学习地图

分值分布 选择+填空+判断:50分 大题:50分 概念 控制系统的数学模型 在控制系统的分析和设计中,首先要建立系统的数学模型。控制系统的数学模型是描述系统内部物理量(或变量)之间关系的数学表达式。 在静态条件下(即变量各阶导数为零),描述变量之间关系的代数方程叫静态…

Synchronous Serial Port 协议详解

1、简介 Synchronous Serial Port (SSP) &#xff0c;基于下图文档的设计标准 1.1、包含3种数据帧格式&#xff1a; a Motorola SPI-compatible interface&#xff08;以下简称SPI&#xff09;a Texas Instruments synchronous serial interface&#xff08;简写SSI&#xff…

前端OpenAPI根据后端Swagger自动生成前端接口报错

测试之后发现是因为Map<Long,List<CommentVO>>的返回值类型的锅&#xff0c;改成Page<List<CommentVO>>即可解决。 前端使用的umiMAX的openapi&#xff0c;报错如下&#xff1a; originalRef: BaseResponseboolean\n "401&q…

在线预约陪诊小程序

一、前言 随着社会老龄化加剧以及人们健康意识的提高&#xff0c;就医过程中的陪伴需求日益增长。许多患者在面对复杂的医院环境、繁琐的就医流程时&#xff0c;需要有人协助挂号、候诊、取药等&#xff0c;而家属可能因工作繁忙无法全程陪同。同时&#xff0c;异地就医的患者更…

信号滤波分析-低通分析(Matlab)

Matlab低通滤波 信号滤波分析-低通分析&#xff08;Matlab&#xff09; 【标价是仅源码的价格】 【有课程设计答辩PPT和设计文档报告】 需要或感兴趣可以随时联系博主哦&#xff0c;常在线秒回&#xff01; 低通滤波分析方案的设计包括&#xff1a; 1.信号生成原理 2.低通滤波…

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之复合运算符

&#xff08;一&#xff09;、复合运算符 在C中&#xff0c;可以通过“赋值语句”来修改变量的值。赋值语句的格式&#xff1a; 变量名 值或者表达式&#xff1b;其中""称为"赋值运算符"。 除此之外&#xff0c;在赋值运算符当中&#xff0c;C有复合赋…

半导体器件与物理篇5 1~4章课后习题

热平衡时的能带和载流子浓度 例 一硅晶掺入每立方厘米10^{16}个砷原子&#xff0c;求室温下(300K)的载流子浓度与费米能级。 需要用到的公式包括1.本征载流子浓度公式 2.从导带底算起的本征费米能级 2.从本征费米能级算起的费米能级 载流子输运现象 例1:计算在300K下&#x…

Qt-Advanced-Docking-System配置及使用、心得

Qt-Advanced-Docking-System 1. Qt-Advanced-Docking-System描述2. 功能特点2.1. 灵活的停靠方式2.2. 嵌套停靠2.3. 自定义布局保存与恢复2.4. 外观和行为定制 3. 与Qt原生停靠系统的比较4. 使用场景4.1. 集成开发环境&#xff08;IDE&#xff09;4.2. 图形设计软件4.3. 数据分…

Vue中纯前端实现导出简单Excel表格的功能

Vue 前端Excel导出 Vue中纯前端导出简单Excel表格的方法(使用vue-json-excel插件) 前言 在许多的后台系统中少不了导出Excel表格的功能&#xff0c;在项目中纯前端使用vue-json-excel插件来实现简单Excel表格的导出功能。 使用方法 1、安装依赖 npm install vue-json-exc…

【系统分析师】-收官整理-已考过

1、考试历程 之前从未参加过软考 2023年11月系统架构师【未通过】 2024年05月系统架构师【已通过】 2024年11月系统分析师【已通过】 鉴于架构师与分析师在基础知识上比较相似&#xff0c;在看到架构考试通过后&#xff0c;就准备往系分方面。 2、考题分析 今年下半年系分考试…