Java「Deque」 方法详解:从入门到实战

Java Deque 各种方法解析:从入门到实战

在 Java 编程中,Deque(双端队列)是一个功能强大的数据结构,允许开发者从队列的两端高效地添加、删除和检查元素。作为 java.util 包中的一部分,Deque 接口继承自 Queue,并扩展了支持双端操作的能力。无论是实现栈、队列,还是处理复杂的算法问题,Deque 都展现了其灵活性和实用性。

本文将深入解析 Deque 的各种方法,涵盖其分类、用法及示例代码,帮助你在 CSDN 社区中快速掌握这一数据结构,提升代码的专业性与效率。无论你是 Java 初学者还是有经验的开发者,这篇博客都将为你提供全面的学习资源。


什么是 Deque?

DequeDouble 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]}
}

说明:
addFirstaddLast 在队列满时抛出 IllegalStateException,而 offerFirstofferLast 更温和,仅返回布尔值,适合需要容错的场景。


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]}
}

说明:
removeFirstremoveLast 要求队列非空,否则抛异常;pollFirstpollLast 更安全,适合处理不确定是否为空的情况。


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]}
}

说明:
getFirstgetLast 要求队列非空,而 peekFirstpeekLast 返回 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]}
}

说明:
pushpop 是栈的经典操作,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,适合容错处理。
  • 空队列处理:操作空队列时,removeget 会抛异常,需提前检查 isEmpty()pollpeek 更安全。
  • 性能考虑ArrayDeque 是大多数场景下的首选,因其基于数组实现,内存效率和操作速度更高。

结语

通过对 Deque 各种方法的详细解析,我们可以看到它在 Java 中的强大功能和灵活性。从添加、删除到检查元素,Deque 提供了丰富的接口,适用于栈、队列等多种数据结构需求。掌握这些方法,不仅能提升代码效率,还能让你的程序更具专业性。

希望这篇博客能帮助你在 CSDN 社区中深入理解 Deque,并在实际项目中灵活运用。欢迎留言讨论你的使用经验或问题,让我们一起进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg+QOpenGLWidget显示视频

​一个基于 ‌FFmpeg 4.x‌ 和 QOpenGLWidget的简单视频播放器代码示例&#xff0c;实现视频解码和渲染到 Qt 窗口的功能。 1&#xff09;ffmpeg库界面&#xff0c;视频解码支持软解和硬解方式。 硬解后&#xff0c;硬件解码完成需要将数据从GPU复制到CPU。优先采用av_hwf…

深入解析嵌入式内核:从架构到实践

一、嵌入式内核概述 嵌入式内核是嵌入式操作系统的核心组件&#xff0c;负责管理硬件资源、调度任务、处理中断等关键功能。其核心目标是在资源受限的环境中提供高效、实时的控制能力。与通用操作系统不同&#xff0c;嵌入式内核通常具有高度可裁剪性、实时性和可靠性&#xff…

20250324-使用 `nltk` 的 `sent_tokenize`, `word_tokenize、WordNetLemmatizer` 方法时报错

解决使用 nltk 的 sent_tokenize, word_tokenize、WordNetLemmatizer 方法时报错问题 第 2 节的手动方法的法1可解决大部分问题&#xff0c;可首先尝试章节 2 的方法 1. nltk.download(‘punkt_tab’) LookupError: *******************************************************…

『 C++ 』多线程同步:条件变量及其接口的应用实践

文章目录 条件变量概述条件变量简介条件变量的基本用法 案例&#xff1a;两个线程交替打印奇偶数代码解释 std::unique_lock::try_lock_until 介绍代码示例代码解释注意事项 std::condition_variable::wait 详细解析与示例std::condition_variable::wait 接口介绍代码示例代码解…

【VolView】纯前端实现CT三维重建-CBCT

文章目录 什么是CBCTCBCT技术路线使用第三方工具使用Python实现使用前端实现 纯前端实现方案优缺点使用VolView实现CBCT VolView的使用1.克隆代码2.配置依赖3.运行4.效果 进阶&#xff1a;VolView配合Python解决卡顿1.修改VtkThreeView.vue2.新增Custom3DView.vue3.Python生成s…

debug - 安装.msi时,为所有用户安装程序

文章目录 debug - 安装.msi时&#xff0c;为所有用户安装程序概述笔记试试在目标.msi后面直接加参数的测试 备注备注END debug - 安装.msi时&#xff0c;为所有用户安装程序 概述 为了测试&#xff0c;装了一个test.msi. 安装时&#xff0c;只有安装路径的选择&#xff0c;没…

Java Stream两种list判断字符串是否存在方案

这里写自定义目录标题 背景初始化方法一、filter过滤方法二、anyMatch匹配 背景 在项目开发中&#xff0c;经常遇到筛选list中是否包含某个子字符串&#xff0c;有多种方式&#xff0c;本篇主要介绍stream流的filter和anyMatch两种方案&#xff0c;记录下来&#xff0c;方便备…

DeepSeek vs 通义大模型:谁将主导中国AI的未来战场?

当你在深夜调试代码时,是否幻想过AI伙伴能真正理解你的需求?当企业面对海量数据时,是否期待一个真正智能的决策大脑? 这场由DeepSeek和通义领衔的大模型之争,正在重塑中国AI产业的竞争格局。本文将为你揭开两大技术巨头的终极对决! 一、颠覆认知的技术突破 1.1 改变游戏…

3. 轴指令(omron 机器自动化控制器)——>MC_SetOverride

机器自动化控制器——第三章 轴指令 12 MC_SetOverride变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启运动指令▶多重启动运动指令▶异常 MC_SetOverride 变更轴的目标速度。 指令名称FB/FUN图形表现ST表现MC_SetOverride超调值设定FBMC_SetOverride_instan…

从像素到世界:自动驾驶视觉感知的坐标变换体系

接着上一篇 如何让自动驾驶汽车“看清”世界?坐标映射与数据融合详解的概述,这一篇详细讲解自动驾驶多目视觉系统设计原理,并给出应用示例。 摘要 在自动驾驶系统中,准确的环境感知是实现路径规划与决策控制的基础。本文系统性地解析图像坐标系、像素坐标系、相机坐标系与…

附录B ISO15118-20测试命令

本章节给出ISO15118-20协议集的V2G命令&#xff0c;包含json、xml&#xff0c;并且根据exiCodec.jar编码得到exi内容&#xff0c; 读者可以参考使用&#xff0c;测试编解码库是否能正确编解码。 B.1 supportedAppProtocolReq json: {"supportedAppProtocolReq": {…

VLAN章节学习

为什么会有vlan这个技术&#xff1f; 1.通过划分广播域来降低广播风暴导致的设备性能下降&#xff1b; 2.提高网络管理的灵活性和通过隔离网络带来的安全性&#xff1b; 3.在成本不变的情况下增加更多的功能性&#xff1b; VLAN又称虚拟局域网&#xff08;再此扩展&#xf…

FPGA时钟约束

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Create_clock 前言 时钟周期约束&#xff0c;就是对时钟进行约束。 一、Create_clock create_clock -name <name> -period <period> -waveform …

机房布局和布线的最佳实践:如何打造高效、安全的机房环境

机房布局和布线的最佳实践:如何打造高效、安全的机房环境 大家好,我是Echo_Wish。今天我们来聊聊机房布局和布线的问题,这可是数据中心和IT运维中的一个非常重要的环节。不管是刚刚接触运维的新人,还是已经摸爬滚打多年的老兵,都应该对机房的布局和布线有一个清晰的认识。…

spring-security原理与应用系列:建造者

目录 1.构建过程 AbstractSecurityBuilder AbstractConfiguredSecurityBuilder WebSecurity 2.建造者类图 SecurityBuilder ​​​​​​​AbstractSecurityBuilder ​​​​​​​AbstractConfiguredSecurityBuilder ​​​​​​​WebSecurity 3.小结 紧接上一篇文…

OpenHarmony子系统开发 - 电池管理(二)

OpenHarmony子系统开发 - 电池管理&#xff08;二&#xff09; 五、充电限流限压定制开发指导 概述 简介 OpenHarmony默认提供了充电限流限压的特性。在对终端设备进行充电时&#xff0c;由于环境影响&#xff0c;可能会导致电池温度过高&#xff0c;因此需要对充电电流或电…

xy轴不等比缩放问题——AUTOCAD c#二次开发

在 AutoCAD .net api里&#xff0c;部分实体&#xff0c;像文字、属性、插入块等&#xff0c;是不支持非等比缩放的。 如需对AutoCAD中图形进行xyz方向不等比缩放&#xff0c;则需进行额外的函数封装。 选择图元&#xff0c;指定缩放基准点&#xff0c;scaleX 0.5, scaleY …

如何在 HTML 中创建一个有序列表和无序列表,它们的语义有何不同?

大白话如何在 HTML 中创建一个有序列表和无序列表&#xff0c;它们的语义有何不同&#xff1f; 1. HTML 中有序列表和无序列表的基本概念 在 HTML 里&#xff0c;列表是一种用来组织信息的方式。有序列表就是带有编号的列表&#xff0c;它可以让内容按照一定的顺序呈现&#…

kafka的文章

1.面试的问题 要点 至多一次、恰好一次数据一致性超时重试、幂等消息顺序消息挤压延时消息 1.1 kafaka 生产消息的过程。 在消息发送的过程中&#xff0c;涉及到了两个线程&#xff0c;一个是main 线程&#xff0c;一个是sender 线程。在main 线程中创建了一个双端队列 Reco…

以mysql 为例,增删改查语法及其他高级特性

以下是 MySQL 的 增删改查语法及 高级特性的详细整理&#xff0c;结合示例说明&#xff1a; 1. 基础操作&#xff08;CRUD&#xff09; (1) 创建数据&#xff08;INSERT&#xff09; -- 单条插入 INSERT INTO users (id, name, email) VALUES (1, Alice, aliceexample.com);…