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++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
