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: 具体…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
