java Deque 详解

在 Java 中,Deque(双端队列)是一个支持在两端插入和删除的队列。它是 Java Collections Framework 的一部分,通过接口和实现类提供了高效的双端操作能力。


Deque 基础概念

  • Deque双端队列,支持在队列的 头部尾部 添加、删除、访问元素。
  • 它继承自 Queue 接口,是一种更加通用的数据结构。
  • 既可以用作 队列(FIFO),也可以用作 栈(LIFO)
接口定义

Deque 是一个接口,常用实现类有:

  • ArrayDeque:基于动态数组的双端队列实现。
  • LinkedList:基于双向链表的双端队列实现。
常见操作分类
  1. 头部操作addFirstremoveFirstgetFirst
  2. 尾部操作addLastremoveLastgetLast
  3. 通用队列操作offerpollpeek

Deque 的方法详解

1. 添加元素

  • 在头部添加

    • void addFirst(E e):在队列头部插入元素,若队列满则抛出异常。
    • boolean offerFirst(E e):在队列头部插入元素,若队列满返回 false
  • 在尾部添加

    • void addLast(E e):在队列尾部插入元素,若队列满则抛出异常。
    • boolean offerLast(E e):在队列尾部插入元素,若队列满返回 false
示例:
Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1); // 在头部添加
deque.addLast(2);  // 在尾部添加
System.out.println(deque); // 输出:[1, 2]

2. 删除元素

  • 从头部删除

    • E removeFirst():删除并返回头部元素,若队列为空则抛出异常。
    • E pollFirst():删除并返回头部元素,若队列为空返回 null
  • 从尾部删除

    • E removeLast():删除并返回尾部元素,若队列为空则抛出异常。
    • E pollLast():删除并返回尾部元素,若队列为空返回 null
示例:
Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1);
deque.addLast(2);
deque.removeFirst(); // 删除头部元素
deque.removeLast();  // 删除尾部元素
System.out.println(deque); // 输出:[]

3. 访问元素

  • 访问头部元素

    • E getFirst():获取但不删除头部元素,若队列为空则抛出异常。
    • E peekFirst():获取但不删除头部元素,若队列为空返回 null
  • 访问尾部元素

    • E getLast():获取但不删除尾部元素,若队列为空则抛出异常。
    • E peekLast():获取但不删除尾部元素,若队列为空返回 null
示例:
Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1);
deque.addLast(2);

System.out.println(deque.getFirst()); // 输出:1
System.out.println(deque.getLast());  // 输出:2

4. 栈操作(LIFO)

  • void push(E e):将元素压入栈顶(相当于 addFirst)。
  • E pop():移除并返回栈顶元素(相当于 removeFirst)。
示例:
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1); // 压入栈顶
stack.push(2);
System.out.println(stack.pop()); // 弹出栈顶元素,输出:2
System.out.println(stack.pop()); // 输出:1

5. 队列操作(FIFO)

  • boolean offer(E e):将元素添加到队列尾部(相当于 offerLast)。
  • E poll():移除并返回队列头部元素(相当于 pollFirst)。
  • E peek():获取但不删除队列头部元素(相当于 peekFirst)。
示例:
Deque<Integer> queue = new ArrayDeque<>();
queue.offer(1); // 添加到尾部
queue.offer(2);
System.out.println(queue.poll()); // 移除头部元素,输出:1
System.out.println(queue.peek()); // 获取头部元素,输出:2

6. 删除所有元素

  • void clear():清空队列。
示例:
Deque<Integer> deque = new ArrayDeque<>();
deque.add(1);
deque.add(2);
deque.clear(); // 清空队列
System.out.println(deque.isEmpty()); // 输出:true

7. 检查队列状态

  • boolean isEmpty():检查队列是否为空。
  • int size():返回队列中元素的数量。

Deque 的实现类

1. ArrayDeque

  • 基于动态数组实现。
  • 特点
    • 适合用作栈和队列。
    • 线程不安全,但效率较高。
    • 不允许存储 null 元素。
示例:
Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1);
deque.addLast(2);
System.out.println(deque); // 输出:[1, 2]

2. LinkedList

  • 基于双向链表实现。
  • 特点
    • 支持队列和栈操作。
    • 允许存储 null 元素。
    • 适合频繁插入和删除操作的场景。
示例:
Deque<Integer> deque = new LinkedList<>();
deque.addFirst(1);
deque.addLast(2);
System.out.println(deque); // 输出:[1, 2]

常见应用场景

1. 栈实现(LIFO 模式)

Deque 提供了 pushpop 方法,可以方便地模拟栈。

示例:
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1);
stack.push(2);
System.out.println(stack.pop()); // 输出:2
System.out.println(stack.pop()); // 输出:1

2. 队列实现(FIFO 模式)

Deque 提供了 offerpoll 方法,可以模拟队列操作。

示例:
Deque<Integer> queue = new ArrayDeque<>();
queue.offer(1);
queue.offer(2);
System.out.println(queue.poll()); // 输出:1
System.out.println(queue.poll()); // 输出:2

3. 滑动窗口

Deque 可以用作维护滑动窗口的数据结构,例如最大值或最小值的计算。


4. 双端处理

Deque 支持从两端同时处理数据,例如支持同时从头尾访问元素的算法(如回文检查)。


总结

方法分类常用方法描述
添加元素addFirstaddLastoffer向头部或尾部添加元素
删除元素removeFirstremoveLast从头部或尾部删除元素
访问元素getFirstgetLastpeek获取头部或尾部元素,但不删除
栈操作pushpop用作栈的 LIFO 操作
队列操作offerpollpeek用作队列的 FIFO 操作
清空队列clear删除所有元素

推荐使用场景

  • 对于简单的栈或队列操作,使用 ArrayDeque
  • 对于需要频繁插入、删除或允许存储 null 的场景,选择 LinkedList

Deque 是一个功能强大的双端数据结构,在队列和栈操作中非常灵活。根据实际需求选择实现类即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频汇聚平台Liveweb国标GB28181视频平台监控中心设计

在现代安防视频监控领域&#xff0c;Liveweb视频汇聚平台以其卓越的兼容性和灵活的拓展能力&#xff0c;为用户提供了一套全面的解决方案。该平台不仅能够实现视频的远程监控、录像、存储与回放等基础功能&#xff0c;还涵盖了视频转码、视频快照、告警、云台控制、语音对讲以及…

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本。 原因是&#xff1a;当前操作系统版本为Windows Server 2016 Standard版本&#xff0c;其自带的Microsoft .NET Framework 版本为4.6太低&#xff0c;不满足要求。 根据报错的提示&#xff0c;点击链接…

重塑视频新语言,让每一帧都焕发新生——Video-Retalking,开启数字人沉浸式交流新纪元!

模型简介 Video-Retalking 模型是一种基于深度学习的视频再谈话技术&#xff0c;它通过分析视频中的音频和图像信息&#xff0c;实现视频角色口型、表情乃至肢体动作的精准控制与合成。这一技术的实现依赖于强大的技术架构和核心算法&#xff0c;特别是生成对抗网络&#xff0…

Llama-2-7b:vocab size:32000;embeddings:4096;hidden_layers是什么意思

目录 Llama-2-7b:vocab size:32000;embeddings:4096 vocab size:模型能解析词汇数量==n_vocab num_hidden_layers: 32 nanogpt隐藏层4 "initializer_range": 0.02 Token Embed是什么 举例说明 不同Chat版本的Token Embed(Token Embeddings) 区别 Llama…

Spring Boot【三】

自动注入 xml中可以在bean元素中通过autowire属性来设置自动注入的方式&#xff1a; <bean id"" class"" autowire"byType|byName|constructor|default" /> byName&#xff1a;按照名称进行注入 byType&#xff1a;按类型进行注入 constr…

mysql之基本常用的语法

mysql之基本常用的语法 1.增加数据2.删除数据3.更新/修改数据4.查询数据4.1.where子句4.2.order by4.3.limit与offset4.4.分组与having4.5.连接 5.创建表 1.增加数据 insert into 1.指定列插入 语法&#xff1a;insert into table_name(列名1,列名2,....,列名n) values (值1,值…

【模电】整流稳压电源

1.整流稳压电源 主要由四大部分组成&#xff0c;分别是&#xff1a; 1&#xff09;电源变压器 2&#xff09;整流电路 3&#xff09;滤波电路 4&#xff09;稳压电路 2.整流电路 2.1半波整流 2.1.1工作原理 平均电压计算 结构最简单&#xff0c;但是只利用了了半个周期的…

ATTCK红队评估实战靶场(二)

http://vulnstack.qiyuanxuetang.net/vuln/?page2 描述&#xff1a;红队实战系列&#xff0c;主要以真实企业环境为实例搭建一系列靶场&#xff0c;通过练习、视频教程、博客三位一体学习。本次红队环境主要Access Token利用、WMI利用、域漏洞利用SMB relay&#xff0c;EWS re…

gitee:删除仓库

1、点击主页面设置 2、找到左侧导航栏-数据管理->仓库空间信息&#xff1b;找到需要删除的仓库->点击设置 3、点击左侧仓库设置->点击右侧删除仓库 4、输入提示内容->确认删除 5、输入密码验证 6、成功删除提示

【JavaEE初阶 — 网络编程】TCP流套接字编程

TCP流套接字编程 1. TCP &#xff06; UDP 的区别 TCP 的核心特点是面向字节流&#xff0c;读写数据的基本单位是字节 byte 2 API介绍 2.1 ServerSocket 定义 ServerSocket 是创建 TCP 服务端 Socket 的API。 构造方法 方法签名 方法说明 ServerS…

Scala入门基础(20)数据集复习拓展

一.Stack栈二.Queue 队列 一.Stack栈 Stack:栈&#xff0c;特殊的结构。它对元素的操作是在头部&#xff1a;栈顶 先进后出的队列。pop表示取出&#xff0c;push表示在栈中添加元素 二.Queue 队列 Queue 队列;先进先出.enqueue入队&#xff0c;dequeue出队。

ThinkPHP Nginx 重写配置

目录 NGINX 重写 Admin项目隐藏入口文件&#xff0c;且禁用Admin模块&Admin.php 1️⃣配置仅用模块 2️⃣新增admin_xyz.php文件&#xff08;自定义入口文件名&#xff09;&#xff0c;并绑定admin模块 3️⃣配置nginx 重写规则 NGINX 重写 在Nginx低版本中&#xff0…

深度学习基础3

目录 1.过拟合与欠拟合 1.1 过拟合 1.2 欠拟合 1.2 解决欠拟合 1.2.1 L2正则化 1.2.2 L1正则化 1.2.3 Dropout 1.2.4 简化模型 1.2.5 数据增强 1.2.6 早停 1.2.7 模型集成 1.2.8 交叉验证 2.批量标准化 2.1 实现过程 2.1.1 计算均值和方差 2.1.2 标准化 2.1.3…

Scala习题

姓名&#xff0c;语文&#xff0c;数学&#xff0c;英语 张伟&#xff0c;87&#xff0c;92&#xff0c;88 李娜&#xff0c;90&#xff0c;85&#xff0c;95 王强&#xff0c;78&#xff0c;90&#xff0c;82 赵敏&#xff0c;92&#xff0c;88&#xff0c;91 孙涛&#xff0c…

【赵渝强老师】PostgreSQL的数据库

PostgreSQL的逻辑存储结构主要是指数据库中的各种数据库对象&#xff0c;包括&#xff1a;数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid&#xff08;object identifiers&#xff09;,它是一个无符号的四字节整数&#xff0c;相关对象的oid都…

(C语言) 8大翻译阶段

(C语言) 8大翻译阶段 文章目录 (C语言) 8大翻译阶段⭐前言&#x1f5c3;️8大阶段&#x1f5c2;️1. 字符映射&#x1f5c2;️2. 行分割&#x1f5c2;️3. 标记化&#x1f5c2;️4. 预处理&#x1f5c2;️5. 字符集映射&#x1f5c2;️6. 字符串拼接&#x1f5c2;️7. 翻译&…

安全基线检查

一、安全基线检测基础知识 安全基线的定义 安全基线检查的内容 安全基线检查的操作 二、MySQL的安全基线检查 版本加固 弱口令 不存在匿名账户 合理设置权限 合理设置文件权限 日志审核 运行账号 可信ip地址控制 连接数限制 更严格的基线要求 1、禁止远程连接数据库 2、修改…

玩转 uni-app 静态资源 static 目录的条件编译

一. 前言 老生常谈&#xff0c;了解 uni-app 的开发都知道&#xff0c;uni-app 可以同时支持编译到多个平台&#xff0c;如小程序、H5、移动端 App 等。它的多端编译能力是 uni-app 的一大特点&#xff0c;让开发者可以使用同一套代码基于 Vue.js 的语法编写程序&#xff0c;然…

[2024年3月10日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(2))

方法一&#xff08;string&#xff09;&#xff1a; #include <iostream> #include <string> using namespace std;// 检查是否为回文数 bool isPalindrome(int n) {string str to_string(n);int left 0, right str.size() - 1;while (left < right) {if (s…

快速排序hoare版本和挖坑法(代码注释版)

hoare版本 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>// 交换函数 void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; }// 打印数组 void _printf(int* a, int n) {for (int i 0; i < n; i) {printf("%d ", a[i]);}printf("…