Java中 LinkedList<>,ArrayDeque<>的区别 || Queue和Deque的区别
我是你爹
- `LinkedList<>` 和 `ArrayDeque<>` 的区别
- Queue接口 和 Deque接口
- 区别
- `Queue` 的用法
- `Deque` 的用法
LinkedList<>
和 ArrayDeque<>
的区别
1. 数据结构实现方式:
LinkedList
:- 基于链表结构,是一个双向链表。
- 每个元素都是节点,包含值和指向前一个和后一个节点的指针。
ArrayDeque
:- 基于动态数组实现,内部维护了一个循环数组。
- 当容量不足时,会重新分配更大的数组并复制元素。
2. 性能差异:
- 插入和删除操作:
LinkedList
:在链表的头部和尾部进行插入和删除的时间复杂度是 (O(1))。但是,链表的中间插入和删除需要遍历,时间复杂度为 (O(n))。ArrayDeque
:在队列的头部和尾部进行插入和删除的时间复杂度是 (O(1)),因为它是一个双端队列,但在动态扩展数组容量时会有额外的开销。
- 随机访问:
LinkedList
:不支持随机访问。要访问中间的某个元素,需要遍历整个链表,时间复杂度为 (O(n))。ArrayDeque
:不提供随机访问,但由于其基于数组实现,整体的内存布局更加紧凑,缓存命中率高。
3. 内存开销:
LinkedList
:由于每个节点都有前向和后向指针,因此在存储元素时存在较大的内存开销。ArrayDeque
:内存使用效率较高,但当数组扩容时,需要占用更多的内存空间来存储新数组和复制元素。
4. 允许存储 null
元素:
LinkedList
:允许存储null
值。ArrayDeque
:不允许存储null
值,因为null
通常用来指示队列为空的状态,避免引起歧义。
5. 使用场景:
LinkedList
:适合需要频繁在链表中间插入或删除的场景,或者需要作为双端链表(如实现Deque
时)。ArrayDeque
:性能一般比LinkedList
更好,适合用作栈、队列和双端队列。通常ArrayDeque
被认为是栈和队列的更好的选择,因为它的性能更稳定、效率更高。
Queue
和 Deque
是 Java 中的接口,分别用于定义队列(FIFO)和双端队列(可作为栈或队列)。它们的用法有所不同,下面为你详细介绍 Queue
和 Deque
的常见用法以及它们支持的方法。
Queue接口 和 Deque接口
区别
特性 | Queue 接口 | Deque 接口 |
---|---|---|
插入位置 | 只能在尾部插入 | 可以在头部和尾部插入 |
删除位置 | 只能从头部删除 | 可以从头部和尾部删除 |
数据结构 | 先进先出(FIFO) | 支持先进先出(FIFO)和后进先出(LIFO) |
常见实现类 | LinkedList 、PriorityQueue | LinkedList 、ArrayDeque |
常用方法 | add() 、offer() 、poll() 、peek() | addFirst() 、addLast() 、removeFirst() 、removeLast() |
典型应用场景 | 任务排队,消息队列 | 栈实现,双端队列,缓存机制 |
Queue
主要用于实现简单的先进先出(FIFO)队列,只能在尾部插入、头部移除,适合任务调度和消息处理。Deque
更加灵活,可以在两端进行操作,既可以用作队列,也可以用作栈,适合需要双端操作的场景。
Queue
的用法
Queue
是一个单端队列接口,遵循 先进先出(FIFO) 的原则。常见的实现类包括 LinkedList
和 PriorityQueue
。Queue
接口主要用于任务排队、消息队列等应用场景。
常见实现
Queue<Integer> queue = new LinkedList<>();
// 或
Queue<Integer> queue = new ArrayDeque<>();
主要方法
add(E e)
:将元素e
添加到队列尾部,如果队列已满则抛出异常。offer(E e)
:将元素e
添加到队列尾部,返回true
表示成功,false
表示失败。remove()
:移除并返回队列头部的元素,如果队列为空,则抛出NoSuchElementException
。poll()
:移除并返回队列头部的元素,如果队列为空,则返回null
。element()
:返回队列头部的元素,但不移除,如果队列为空,则抛出NoSuchElementException
。peek()
:返回队列头部的元素,但不移除,如果队列为空,则返回null
。
示例代码
Queue<Integer> queue = new LinkedList<>();// 添加元素
queue.add(1);
queue.offer(2);// 获取队列头部元素
System.out.println(queue.peek()); // 输出:1// 移除队列头部元素
System.out.println(queue.poll()); // 输出:1// 获取并移除头部元素
System.out.println(queue.remove()); // 输出:2// 检查队列是否为空
System.out.println(queue.isEmpty()); // 输出:true
使用场景
- 任务排队:适用于管理任务的执行顺序,确保按顺序进行处理。
- 消息队列:用于消息的排队和处理。
Deque
的用法
Deque
(Double-Ended Queue,双端队列)是一个接口,允许在队列的两端插入和删除元素,支持既作为**队列(FIFO)使用,也可以作为栈(LIFO)**使用。常见的实现类有 LinkedList
和 ArrayDeque
。
常见实现
Deque<Integer> deque = new LinkedList<>();
// 或
Deque<Integer> deque = new ArrayDeque<>();
主要方法
-
在队首操作:
addFirst(E e)
:将元素e
添加到队列的头部,如果失败则抛出异常。offerFirst(E e)
:将元素e
添加到队列的头部,返回true
表示成功,false
表示失败。removeFirst()
:移除并返回队列头部的元素,如果队列为空则抛出NoSuchElementException
。pollFirst()
:移除并返回队列头部的元素,如果队列为空则返回null
。getFirst()
:返回队列头部的元素,但不移除,如果队列为空则抛出NoSuchElementException
。peekFirst()
:返回队列头部的元素,但不移除,如果队列为空则返回null
。
-
在队尾操作:
addLast(E e)
:将元素e
添加到队列的尾部,如果失败则抛出异常。offerLast(E e)
:将元素e
添加到队列的尾部,返回true
表示成功,false
表示失败。removeLast()
:移除并返回队列尾部的元素,如果队列为空则抛出NoSuchElementException
。pollLast()
:移除并返回队列尾部的元素,如果队列为空则返回null
。getLast()
:返回队列尾部的元素,但不移除,如果队列为空则抛出NoSuchElementException
。peekLast()
:返回队列尾部的元素,但不移除,如果队列为空则返回null
。
作为栈使用的方法
push(E e)
:将元素e
压入栈(等同于addFirst()
)。pop()
:移除并返回栈顶元素(等同于removeFirst()
)。
示例代码
Deque<Integer> deque = new ArrayDeque<>();// 在头部和尾部插入元素
deque.addFirst(1); // 头部插入 1
deque.addLast(2); // 尾部插入 2// 获取头部和尾部元素
System.out.println(deque.getFirst()); // 输出:1
System.out.println(deque.getLast()); // 输出:2// 在头部和尾部移除元素
deque.removeFirst(); // 移除头部元素
deque.removeLast(); // 移除尾部元素// 作为栈使用
deque.push(3); // 压入栈顶(头部)
System.out.println(deque.pop()); // 弹出栈顶,输出:3
使用场景
- 双端操作:需要在两端进行插入和删除的场景。
- 栈和队列:
Deque
可以既当作栈使用,也可以当作队列使用,灵活性更高。 - 实现复杂的数据结构:例如支持同时在两端操作的缓存机制、滑动窗口等。
相关文章:
Java中 LinkedList<>,ArrayDeque<>的区别 || Queue和Deque的区别
我是你爹 LinkedList<> 和 ArrayDeque<> 的区别Queue接口 和 Deque接口区别Queue 的用法Deque 的用法 LinkedList<> 和 ArrayDeque<> 的区别 1. 数据结构实现方式: LinkedList: 基于链表结构,是一个双向链表。每个…...
freemarker 读取template.xml ,通过response 输出文件,解决中文乱码问题
采用 try (Writer writer new OutputStreamWriter(os, “UTF-8”)) UTF-8 内容转换 public static void setResponseHeader(HttpServletResponse response, String fileName) {try {// fileName "中文.xls";try {fileName new String(fileName.getBytes(),"…...

arkUI:水果选择与管理:基于 ArkUI 的长按编辑功能实现
水果选择与管理:基于 ArkUI 的长按编辑功能实现 1 主要内容说明2 相关内容2.1 相关内容2.1.1 源码1内容的相关说明2.1.1.1 数据结构与状态管理2.1.1.2 添加水果功能2.1.1.3 水果列表展示2.1.1.4 长按进入编辑模式2.1.1.5 复选框的多选功能2.1.1.6 删除水果功能2.1.1…...
docker使用,docker图形化界面+docker详细命令
DockerUI进入 docker container run --rm --name docker.ui -v /var/run/docker.sock:/var/run/docker.sock -p 8999:8999 joinsunsoft/docker.ui访问8999端口就行,就可以图形化管理Docker了 常规使用 搭建 sudo docker-compose build #有一些需要这条命令 su…...

idea项目运行时 java: 错误: 不支持发行版本 21
java项目运行时,同样的项目别的都是正常运行,单个这个项目一直报 java: 错误: 不支持发行版本 21, 报错的解释 这个错误表明你正在尝试使用Java编译器编译一个类,但是编译器遇到了一个它不支持的版本号,在这个上下文…...
hive alter table add columns 是否使用 cascade 的方案
结论 alter table xxx add columns 时加上 cascade 时,会把所有的分区都加上此字段。如果不加则只有新的分区会加上此字段,旧的分区没有此字段,即便数据文件里有对应的数据,也不能显示内容。 如果分区都是 insert overwrite 生成…...

手机怎么玩steam游戏?随时随地远程串流玩steam游戏教程
喜欢在steam上玩游戏的玩家有没有想过,其实这些游戏也能在手机上玩呢?不管是探索的开放世界游戏,还是紧张刺激的射击游戏,还是丰富剧情的视觉小说等等,这些游戏你都可以通过远程串流软件,来帮你实现在手机上…...
【使用antv g6实现拓扑图】
使用antv g6实现拓扑图 安装antv g6创建一个 div,并制定必须的属性 id定义初始化方法定义node节点数据将获取到的数据渲染进页面 安装antv g6 npm install antv/g6 --save import G6 from antv/g6;创建一个 div,并制定必须的属性 id 定义好展示id&…...
【数学 函数空间】拉普拉斯变换解微分方程步骤
拉普拉斯变换解微分方程 拉普拉斯变换解微分方程的一般步骤如下: 写出微分方程。对微分方程两边应用拉普拉斯正变换。求解变换后的代数方程,得到 Y ( s ) Y(s) Y(s)。如果需要,进行部分分式分解。对 Y ( s ) Y(s) Y(s)进行拉普拉斯逆变换&…...
vue3: toRef, reactive, toRefs, toRaw
vue3: toRef, reactive, toRefs, toRaw <template><div>{{ man }}</div><hr><!-- <div>{{ name }}--{{ age }}--{{ like }}</div> --><div><button click"change">修改</button></div&g…...
Unity读取Json
参考 Unity读取Json的几种方法_unity读取json文件-CSDN博客...

基于STM32的智能语音识别饮水机系统设计
功能描述 1、给饮水机设定称呼,喊出称呼,饮水机回答:我在 2、语音进行加热功能,说:请加热,加热片运行 3、饮水机水位检测,低于阈值播报“水量少,请换水” 4、检测饮水机水温…...

c++的几种构造函数
c的几种构造函数 构造函数拷贝构造函数转换构造函数移动构造函数 析构函数 构造函数 C中的构造函数可以分为5类:默认构造函数、普通构造函数、拷贝构造函数、转换构造函数、移动构造函数。 好像还有委托构造 默认构造和普通构造和java基本一样 详细 拷贝构造函…...

FRP 实现内网穿透
如何通过 FRP 实现内网穿透:群晖 NAS 的 Gitea 和 GitLab 访问配置指南 在自建服务的过程中,经常会遇到内网访问受限的问题。本文将介绍如何利用 FRP(Fast Reverse Proxy)来实现内网穿透,以便在外网访问群晖 NAS 上的…...

数据结构笔记(其八)--一般树的存储及其遍历
1.知识总览 一般的树会有多个孩子,所以存储结构也会与二叉树略有不同。 一般树的遍历。 2.双亲表示法 双亲表示法,也是父亲表示法,即每个节点中都存储了其父节点的地址信息。 特性:可以轻易地找到父节点,但寻找孩子节…...

在spring boot工程中使用Filter时,@WebFilter 注解不生效的问题分析和解决方案
1. 问题描述 首先编写一个Filter类并通过Component放入spring容器中,通过实现jakarta.servlet中提供的Filter接口完成过滤器的创建,代码如下。 import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import org.springframework.st…...
浅谈“通感一体”
文章目录 5G_Advanced的关键技术通感一体的介绍通感一体应用通感一体面临的挑战 5G_Advanced的关键技术 2024年6月18日16点30分,在上海举行的3GPP RAN第104次会议上,R18标准正式冻结,标志着5G技术的又一重要里程碑。值得注意的是,…...

【Linux】监控系统Zabbix的安装与配置
文章目录 一、前期准备1、安装LAMP2、配置SELinux与防火墙3、测试Apache4、配置数据库5、创建zabbix数据库及应用 二、server端安装配置1、软件包安装2、配置数据库3、zabbix访问测试4、配置web界面 三、Agent端安装配置1、安装zabbix-agent2、配置3、启动zabbix-agent4、配置防…...
Springboot定时任务
Component EnableScheduling public class SpringBootTestJob {Scheduled(cron "0/5 * * * * ?")public void testScheduled(){System.out.println("SpringBootTestJob test");} }这段代码使用了 Spring Boot 自带的定时任务机制。解释如下: …...
node.js知识点总结
1、Node.js Node. js是一个基于 Chrome v8引擎的服务器端 JavaScript运行环境;Node. js是一个事件驱动、非阻塞式I/O的模型,轻量而又高效;Node. js的包管理器npm是全球最大的开源库生态系统。 2、数据处理中的buffer: 具体…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...