Java「Deque」 方法详解:从入门到实战
Java Deque 各种方法解析:从入门到实战
在 Java 编程中,Deque
(双端队列)是一个功能强大的数据结构,允许开发者从队列的两端高效地添加、删除和检查元素。作为 java.util
包中的一部分,Deque
接口继承自 Queue
,并扩展了支持双端操作的能力。无论是实现栈、队列,还是处理复杂的算法问题,Deque
都展现了其灵活性和实用性。
本文将深入解析 Deque
的各种方法,涵盖其分类、用法及示例代码,帮助你在 CSDN 社区中快速掌握这一数据结构,提升代码的专业性与效率。无论你是 Java 初学者还是有经验的开发者,这篇博客都将为你提供全面的学习资源。
什么是 Deque?
Deque
是 Double Ended Queue
的缩写,意为双端队列。它允许在队列的头部和尾部执行插入、删除和检查操作。Deque
接口定义了一系列方法,使其既可以用作栈(LIFO,后进先出),也可以用作队列(FIFO,先进先出),甚至是更复杂的双端队列。
Java 中 Deque
的常见实现类包括:
ArrayDeque
:基于数组的双端队列,性能优异,推荐使用。LinkedList
:基于双向链表的双端队列,适合特定场景。
接下来,我们将详细解析 Deque
的各种方法,并通过代码示例展示其用法。
Deque 的方法分类与解析
Deque
接口提供了丰富的方法,涵盖添加、删除、检查等操作。为了便于理解,我们将方法分为几类,并逐一讲解。
1. 添加元素的方法
Deque
支持从头部或尾部添加元素,方法分为抛异常和返回布尔值的两类:
addFirst(E e)
:在队列头部添加元素,如果失败(如容量限制)抛出异常。addLast(E e)
:在队列尾部添加元素,失败时抛出异常。offerFirst(E e)
:在队列头部添加元素,返回true
表示成功,false
表示失败。offerLast(E e)
:在队列尾部添加元素,返回是否成功。
示例代码:
import java.util.Deque;
import java.util.ArrayDeque;public class DequeDemo {public static void main(String[] args) {Deque<String> deque = new ArrayDeque<>();deque.addFirst("A"); // 头部添加 "A"deque.addLast("B"); // 尾部添加 "B"deque.offerFirst("C"); // 头部添加 "C"deque.offerLast("D"); // 尾部添加 "D"System.out.println(deque); // 输出: [C, A, B, D]}
}
说明:
addFirst
和 addLast
在队列满时抛出 IllegalStateException
,而 offerFirst
和 offerLast
更温和,仅返回布尔值,适合需要容错的场景。
2. 删除元素的方法
Deque
支持从两端删除元素,方法同样分为抛异常和返回 null
的两类:
removeFirst()
:移除并返回头部元素,队列为空时抛出NoSuchElementException
。removeLast()
:移除并返回尾部元素,队列为空时抛出异常。pollFirst()
:移除并返回头部元素,队列为空时返回null
。pollLast()
:移除并返回尾部元素,队列为空时返回null
。
示例代码:
import java.util.Deque;
import java.util.ArrayDeque;public class DequeDemo {public static void main(String[] args) {Deque<String> deque = new ArrayDeque<>();deque.add("A");deque.add("B");deque.add("C");String first = deque.removeFirst(); // 移除 "A"String last = deque.removeLast(); // 移除 "C"System.out.println("First: " + first); // First: ASystem.out.println("Last: " + last); // Last: CSystem.out.println(deque); // [B]}
}
说明:
removeFirst
和 removeLast
要求队列非空,否则抛异常;pollFirst
和 pollLast
更安全,适合处理不确定是否为空的情况。
3. 检查元素的方法
检查方法用于查看队列两端的元素,但不移除:
getFirst()
:返回头部元素,队列为空时抛出NoSuchElementException
。getLast()
:返回尾部元素,队列为空时抛出异常。peekFirst()
:返回头部元素,队列为空时返回null
。peekLast()
:返回尾部元素,队列为空时返回null
。
示例代码:
import java.util.Deque;
import java.util.ArrayDeque;public class DequeDemo {public static void main(String[] args) {Deque<String> deque = new ArrayDeque<>();deque.add("A");deque.add("B");deque.add("C");String first = deque.getFirst(); // "A"String last = deque.getLast(); // "C"System.out.println("First: " + first); // First: ASystem.out.println("Last: " + last); // Last: CSystem.out.println(deque); // [A, B, C]}
}
说明:
getFirst
和 getLast
要求队列非空,而 peekFirst
和 peekLast
返回 null
,适合避免异常的场景。
4. 栈相关方法
Deque
可以用作栈,支持 LIFO 操作:
push(E e)
:在头部添加元素(等同于addFirst
)。pop()
:移除并返回头部元素(等同于removeFirst
)。
示例代码:
import java.util.Deque;
import java.util.ArrayDeque;public class DequeDemo {public static void main(String[] args) {Deque<String> stack = new ArrayDeque<>();stack.push("A"); // 入栈 "A"stack.push("B"); // 入栈 "B"String top = stack.pop(); // 出栈 "B"System.out.println("Top: " + top); // Top: BSystem.out.println(stack); // [A]}
}
说明:
push
和 pop
是栈的经典操作,Deque
提供了比传统 Stack
类更高效的实现。
5. 队列相关方法
Deque
也可以用作队列,支持 FIFO 操作:
add(E e)
:在尾部添加元素(等同于addLast
)。remove()
:移除并返回头部元素(等同于removeFirst
)。
示例代码:
import java.util.Deque;
import java.util.ArrayDeque;public class DequeDemo {public static void main(String[] args) {Deque<String> queue = new ArrayDeque<>();queue.add("A"); // 入队 "A"queue.add("B"); // 入队 "B"String front = queue.remove(); // 出队 "A"System.out.println("Front: " + front); // Front: ASystem.out.println(queue); // [B]}
}
说明:
这些方法让 Deque
成为标准队列的有效替代品。
6. 其他实用方法
Deque
还提供了一些辅助方法:
size()
:返回队列中元素数量。isEmpty()
:检查队列是否为空。contains(Object o)
:检查是否包含某个元素。clear()
:清空队列。
示例代码:
import java.util.Deque;
import java.util.ArrayDeque;public class DequeDemo {public static void main(String[] args) {Deque<String> deque = new ArrayDeque<>();deque.add("A");deque.add("B");deque.add("C");System.out.println(deque.size()); // 3System.out.println(deque.isEmpty()); // falseSystem.out.println(deque.contains("B")); // truedeque.clear();System.out.println(deque.isEmpty()); // true}
}
说明:
这些方法简单实用,适合日常操作和状态检查。
方法选择时的注意事项
在实际使用中,选择合适的方法至关重要:
- 异常 vs 返回值:
add
/remove
/get
方法在失败时抛异常,适合确保操作成功的场景;offer
/poll
/peek
返回布尔值或null
,适合容错处理。 - 空队列处理:操作空队列时,
remove
和get
会抛异常,需提前检查isEmpty()
;poll
和peek
更安全。 - 性能考虑:
ArrayDeque
是大多数场景下的首选,因其基于数组实现,内存效率和操作速度更高。
结语
通过对 Deque
各种方法的详细解析,我们可以看到它在 Java 中的强大功能和灵活性。从添加、删除到检查元素,Deque
提供了丰富的接口,适用于栈、队列等多种数据结构需求。掌握这些方法,不仅能提升代码效率,还能让你的程序更具专业性。
希望这篇博客能帮助你在 CSDN 社区中深入理解 Deque
,并在实际项目中灵活运用。欢迎留言讨论你的使用经验或问题,让我们一起进步!
相关文章:
Java「Deque」 方法详解:从入门到实战
Java Deque 各种方法解析:从入门到实战 在 Java 编程中,Deque(双端队列)是一个功能强大的数据结构,允许开发者从队列的两端高效地添加、删除和检查元素。作为 java.util 包中的一部分,Deque 接口继承自 Qu…...
简记_FPGA 硬件最小系统设计
一、FPGA板级设计的五要素 1.1、电源电路 核心电压:一般为固定值 IO电压:FPGA的IO分为多个bank,同一个bank的不同IO引脚电压相同,不同bank的电压可以不同 辅助电压:除了核心电压和IO电压,FPGA工作所需的…...
C++题目
1、内存管理 1.内存模型 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。 堆:就是那些由new分配的内存块,其释放由程序员控制(一个new对应一个delete)…...
Vulhub-jangow-01-1.0.1通关攻略
第0步: 打开靶机,按下shift,出现下图界面 在此页面按下e键,进入如下界面, 将ro 替换为 rw signie init/bin/bash 替换完毕后,按下Ctrl键X键,进入如下页面 ip a查看网卡信息 编辑配置文件网卡信…...
入剖析 Android Compose 框架的关键帧动画(keyframes、Animatable)(二十三)
深入剖析 Android Compose 框架的关键帧动画(keyframes、Animatable) 引言 在当今的 Android 应用开发领域,用户体验已成为衡量一款应用成功与否的关键因素之一。而动画作为提升用户体验的重要手段,能够为应用增添生动性和交互性…...
java中的枚举类型和c,c++的有区别吗?c,c++的枚举,结构体,联合体,三种数据有什么区别和联系
Java 枚举类型与 C、C 枚举类型的区别 1. 类型安全 Java:Java 的枚举类型是类型安全的。枚举常量是枚举类型的实例,编译器会严格检查传递的参数是否为该枚举类型的有效常量。例如: java Apply enum Color { RED, GREEN, BLUE } // 编译器会检…...
详解Redis的持久化与数据可靠性
Redis持久化与数据可靠性详解(结合实例) Redis作为内存数据库,持久化是保证数据不丢失的核心机制。它通过将内存数据保存到磁盘,确保服务器重启后能恢复数据。Redis提供RDB、AOF和混合持久化三种方式,下面通过实例和操…...
1、mysql基础篇--概述
关系型数据库(RDBMS) 概念特点:数据模型: 概念 建立在关系模型基础上,有多张表相互连接的二维表组成的数据库 特点: 1、使用表存储,格式统一,便于维护 2、使用sql语言操作&#…...
【Tiny RDM】Redis客户端工具
Tiny RDM Tiny RDM是一款现代化、轻量级、跨平台的Redis客户端,支持Mac、Windows和Linux,目前在Github上已有10kStar。 Github 项目地址: https://github.com/tiny-craft/tiny-rdm 功能特性 极度轻量,基于Webview2,…...
常见框架漏洞攻略-Shiro篇
漏洞名称 Shiro rememberMe反序列化漏洞 漏洞简介 Apache Shiro是⼀个强⼤易⽤的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易⽤,同时也能提供健壮的安全性。 漏洞原理 在Shiro框架下,⽤户登陆成功后会⽣成…...
常见框架漏洞之一:Thinkphp5x
ThinkPHP是为了简化企业级应⽤开发和敏捷WEB应⽤开发⽽诞⽣的,是⼀个快速、兼容⽽且简单的轻量级国产PHP开发框架,诞⽣于2006年初,原名FCS,2007年元旦正式更名为 ThinkPHP,遵循Apache2开源协议发布,从Stru…...
MORL4PDEs:基于多目标优化与强化学习的数据驱动偏微分方程发现
摘要:本文提出了一种结合多目标优化与强化学习的数据驱动方法MORL4PDEs,用于从复杂系统观测数据中发现简洁的偏微分方程(PDE)。该方法无需预定义候选函数库,通过神经网络代理生成符号表达式,结合遗传算法优…...
UniApp和微信小程序中v-switch夜间模式动画开关
UniApp兼容版 <template><view><view class"main-container" :style"{ backgroundColor: value ? #45e3f9 : #20114c,transform:scale(${size})}" tap"onClick"><view class"content" :style"{ left: val…...
六十天Linux从0到项目搭建第四天(通配符命令、其他命令、压缩解压工具、shell的感性理解、linux权限解析)
通配符(Wildcard) 是 Shell 提供的特殊字符,用于 匹配文件名或路径名,可以代替一个或多个字符,使得命令能批量操作文件,而无需手动输入每个文件名。 典型用法 * 匹配任意字符 *.txt → 匹配所有 .txt 文…...
RAG优化:python从零实现自适应检索增强Adaptive Retrieval
开篇:当RAG遇上“自适应大脑”,检索从此不再“一根筋”!🧠 想象一下,你的AI助手是个超级聪明的“学霸”,但有时候却像个“一根筋”的机器人——无论你问它什么,它都用同一种方式去回答。问它“什么是XAI?”它给你一堆定义;问它“AI发展太快了吗?”它还是给你一堆定…...
C语言实现的冰墩墩
在windows系统下,vs 2022编译。 其中#include <graphics.h>需要自己下载安装。 环境配置没什么难度,直接上demo。 代码如下: #include <graphics.h> #include <conio.h> #include <math.h> #define PI acos(-1.0…...
【构建CV图像识别系统】从传统方法到深度学习
目录 1. 图像的基本概念1.1 像素与色彩1.2 过滤与卷积 2. 图像分类与检测3. 图像特征的提取3.1 全局特征3.2 局部特征3.2.1 边缘(Edge)3.2.2 角点(Corner)3.2.3 SIFT 特征 4. 传统方法与深度学习在图像识别中的应用4.1 基于传统方…...
在Centos 7环境下安装MySQL
前言:在安装与卸载MySQL时,用户需切换为root,这样安装之后,普通用户也能够使用。 Tips:我们在刚开始学习时,尽量全部使用root进行,适应mysql语句,后面学了用户管理,就可以考虑新建普…...
【机器学习基础 4】 Pandas库
一、Pandas库简介 Pandas 是一个开源的 Python 数据分析库,主要用于数据清洗、处理、探索与分析。其核心数据结构是 Series(一维数据)和 DataFrame(二维表格数据),可以让我们高效地操作结构化数据。Pandas …...
干部监督预警系统的定义与功能
一、干部监督预警系统是什么? 干部监督预警系统是通过整合多源数据(如干部档案、履职表现、廉政记录、舆情反馈等),利用大数据分析、人工智能等技术,对干部行为进行实时监测、风险评估和分级预警的数字化管理工具。 二…...
可视化图解算法:链表的奇偶重排(排序链表)
1. 题目 描述 给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。 注意是节点的编号而非节点的数值。 数据范围:节点数量满足 0≤n≤105,节点中的值都满足 0≤val≤10000 要…...
获取小红书笔记详情接口的详细指南
一、引言 小红书作为一个集社交、购物、分享于一体的综合性平台,拥有海量的用户和丰富的笔记内容。小红书笔记详情API接口为开发者提供了一种高效获取笔记详细信息的方法,包括笔记的标题、正文、图片、视频、标签、点赞数、评论数等。这些数据可以帮助开…...
麒麟系统运维指令
麒麟系统运维指令 麒麟系统运维指令1、 查看系统版本2、查看系统信息3、用户与权限管理4. 网络相关命令5. 包管理6. 文件操作7. 进程管理 麒麟系统运维指令 1、 查看系统版本 目的指令查看操作系统版本信息cat /etc/os-release查看操作系统版本信息hostnamectl查看内核版本un…...
pyqt SQL Server 数据库查询
一、概述 本项目旨在开发一个基于 Python 和 PyQt6 的数据库查询工具,该工具能够连接到 SQL Server 数据库,显示数据库中的表名,支持用户输入 SQL 查询语句进行数据查询,并将查询结果展示在表格中。同时,为了提升用户…...
抓包软件【Fiddler】
我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲Fiddler 什么是Fidder Fiddler是一款非常流行并且实用的HTTP抓包工具,原理是在电脑上开启一个HTTP代理服务器,然后转发所有的HTTP请求和响应。是用C#开发的工具…...
SpringCould微服务架构之Docker(1)
项目中微服务比较多的时候,一个一个手动的部署太麻烦了,所以就需要用到Docker。 项目部署中的问题: Docker是一种快速交付应用、运行应用的技术。...
计算图(Computation Graph)
在强化学习中,TensorFlow的计算图(Computation Graph)是用于描述模型结构和训练流程的核心机制。 1. 计算图的基本概念 定义:计算图是TensorFlow中表示数学运算和数据流动的有向图。图中的节点(Nodes)代表…...
邮件营销:如何设置合适的发送频率
在邮件营销里,把握好发送频率特别关键,这直接关系到客户愿不愿意搭理你的邮件,以及邮件营销能不能达到预期效果。下面这几个步骤和建议,能帮你找到合适的邮件发送频率: 一、了解目标受众 分析客户行为:查…...
React项目中,递归写法获取tree的id集合
后端接口返回一个childrens的树,最后要拿到的是每个childrens下第一个对象的id集合,用于编辑页的回显 采用的是递归写法!!!!!!!! const categoryIds: Array&…...
深入解析Linux网络、安全与容器技术
1. Netfilter:Linux内核的包处理框架 Netfilter 是Linux内核中用于控制网络数据包的核心机制,负责处理数据包的过滤、修改和转发。其核心功能包括: 包过滤(Packet Filtering):根据规则允许或拒绝数据包通过…...
AF3 Rotation 类解读
Rotation 类(rigid_utils 模块)是 AlphaFold3 中用于 3D旋转 的核心组件,支持两种旋转表示: 1️⃣ 旋转矩阵 (3x3) 2️⃣ 四元数 (quaternion, 4元向量) 👉 设计目标: 允许灵活选择 旋转矩阵 或 四元数 封装了常用的 旋转操作(组合、逆旋转、应用到点上等) 像 torch.…...
数据预处理习题
简述常用的文本数据类型。 结构化文本:如数据库中的表格数据、JSON/XML格式数据,具有明确的字段和层级关系。非结构化文本:如自然语言文本(新闻、社交媒体内容)、长文档(书籍、论文)࿰…...
常见框架漏洞—中间件IIS
一.IIS6.x篇 1.在Windows server 2003中搭建网站 2.访问网站,并对该网站进行抓包 3.修改提交方式为PUT,然后写入木马 4.修改提交方式为MOVE,令将其更名为脚本⽂档后缀 5.我们在Windows server 2003中可以看到我们上传的shell.asp 6.我们在网…...
群体智能优化算法-蚁狮优化算法(Ant Lion Optimizer, ALO,含Matlab源代码)
一、文章摘要 蚁狮优化算法(Ant Lion Optimizer,ALO)是一种新颖的元启发式算法,由Mirjalili提出,其灵感来源于自然界中蚁狮幼虫构筑陷阱捕猎蚂蚁的行为。该算法通过模拟蚂蚁的随机游走、蚁狮的陷阱机制、陷阱缩小及精…...
【计算机视觉】数据增强
一、数据增强的意义 在深度学习中,数据集往往有限,而模型需要大量的样本来学习特征。数据增强技术通过对图像进行如下变换: 扩充样本数量:利用已有数据生成新的样本。提高模型鲁棒性:使模型适应不同的图像变换&#…...
BERT文本分类实战----美团外卖评论情绪分类
HuggingFace 提供了巨大的模型库,虽然其中的很多模型性能表现出色,但这些模型往往是在广义的数据集上训练的,缺乏针对特定数据集的优化,所以在获得一个合适的模型之后,往往还要针对具体任务的特定数据集进行二次训练&a…...
Chrome 133 版本开发者工具(DevTools)更新内容
Chrome 133 版本开发者工具(DevTools)更新内容 一、持久化的 AI 聊天记录 AI 助手面板会在本地持久化聊天记录,即使重新加载 DevTools 或 Chrome,也可以查看之前与 Gemini 的对话内容。 二、Performance 面板改进 此版本为 Per…...
大模型应用(Java)2025/3/24
大佬视频👉使用Java实现一个基础的大模型RAG问答对话系统_哔哩哔哩_bilibili 需求 让大模型来理解知识库内容,并根据知识库回答。 通过本次应用我学到了: RAG工程的基本处理框架流程(基于java)向量数据库的基础使用…...
基于Sentinel-1A GRD洪涝淹没范围提取(SDWI阈值法和OSTU自动阈值法)
0 前言 两幅灾前和灾后的遥感影像经过SARscape配准、滤波、辐射定标预处理之后,使用GDAL库分别使用SDWI阈值法和OSTU自动阈值法提取洪涝淹没范围 1 ENVI 5.6和SARscape5.6安装 通过网盘分享的文件:ENVI5(1).6 链接: https://pan.baidu.com/s/1mKcEkC3…...
PPT 转高精度图片 API 接口
PPT 转高精度图片 API 接口 文件处理 / 图片处理,将 PPT 文件转换为图片序列。 1. 产品功能 支持将 PPT 文件转换为高质量图片序列;支持 .ppt 和 .pptx 格式;保持原始 PPT 的布局和样式;转换后的图片支持永久访问;全…...
IOS接入微信方法
导入SDK 和配置 SDK 的不做介绍; 1 在IOS 开发者中心 Identifiers 打开‘Associated Domains’ 2 建立一个文件(不带后缀的)apple-app-site-association, teamid在 IOS 开发者中心的会员找,appid在 xcode里面找 {"applin…...
隐式与显式等待的区别及混合使用
隐式等待(Implicit Wait)和显式等待(Explicit Wait)是 Selenium WebDriver 中两种不同的等待机制,用于处理动态加载的页面元素或异步操作。以下是它们的区别、作用范围以及混合使用的注意事项: 1. 核心区别…...
Selenium基本使用(三)隐藏框、获取文本、断言、切换窗口
1、定位文本框,密码框,按钮 案例一: 网站:过期更新 from selenium import webdriver import time dxwebdriver.Chrome() dx.get("过期更新") time.sleep(2) dx.find_element_by_name("userAccount").send_keys("…...
蓝桥杯,利用 Vue.js 构建简易任务管理器
在日常开发中,我们经常需要处理各种任务和计划。一个简单且高效的任务管理器可以帮助我们更好地组织和安排时间。今天,我将向大家展示如何使用 Vue.js 构建一个简易的任务管理器。这个项目不仅能够帮助我们更好地理解 Vue.js 的基本语法和功能࿰…...
vmwaretools解压失败|vmware tools distrib cannot mkdir read only file system|bug汇总
最简单的一条路线:你的解压命令用sudo了吗? 这个方法不能解决的话就看下面内容。本文提供给你全过程思路。 如需转载,标记出处 背景: 之前虚拟机和主机的复制黏贴还能用,今天突然用不了,重新下载安装包&am…...
类与对象(中)(详解)
【本节目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 6. const成员函数 7. 取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗&…...
2025-03-21 Unity 网络基础3——TCP网络通信准备知识
文章目录 1 IP/端口类1.1 IPAddress1.2 IPEndPoint 2 域名解析2.1 IPHostEntry2.2 Dns 3 序列化与反序列化3.1 序列化3.1.1 内置类型 -> 字节数组3.1.2 字符串 -> 字节数组3.1.3 类对象 -> 字节数组 3.2 反序列化3.2.1 字节数组 -> 内置类型3.2.2 字节数组 -> 字…...
练习8-8 移动字母
练习8-8 移动字母 day 8 void Shift( char s[] ){int lenstrlen(s);int a[3];for(int i0;i<3;i){a[i]s[i];}for(int i3;i<len;i){s[i-3]s[i];}s[len-3]a[0];s[len-2]a[1];s[len-1]a[2]; }...
BigEvent项目后端学习笔记(二)文章分类模块 | 文章分类增删改查全流程解析(含优化)
📖 模块概述 文章分类模块包括 新增文章分类、文章分类列表、获取文章分类详情、更新文章分类、删除文章分类 功能。本篇对于原项目进行了代码优化,将原先写在 Controller 层的业务逻辑代码迁移至了 Service 层。 🛠️ 技术实现要点 分组校…...
蓝桥杯,冬奥大抽奖
在日常的网页开发中,抽奖功能是一种常见的交互设计,它可以增加用户的参与感和趣味性。今天,我将分享一个简单的抽奖转盘实现,它使用了HTML、CSS和JavaScript,非常适合初学者学习和理解前端开发的基本概念。 一、项目背…...