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: 具体…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...