关于Deque的详解

article/2025/10/4 3:36:07

1. 定义
双向队列:支持插入删除元素的线性集合;java官方文档推荐用deque实现栈(stack)。

2. 和Queue的区别
Deque是double ended queue,将其理解成双端结束的队列,双端队列,可以在首尾插入或删除元素。
Queue的解释中,Queue就是简单的FIFO队列;所以在概念上来说,Queue是FIFO的单端队列,Deque是双端队列。

Queue:只能一端进,并且在另一端出的队列。

Deque:在队列的两端都能进出的队列,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。

3. 继承关系

4. 被弃用的Stack

4.1 被弃用的原因
从继承关系中,我们可以看到Stack的基本方法与底层实现,由于Vector是动态数组接口,其底层的实现是数组,因此,Stack的底层实现也是数组,且继承了Vector的公共方法。

Vector类具有动态扩容和随机访问的特性,因此,继承了Vector类的Stack也同样具有这些特性,这恰好违背了Stack数据结构的设计原理,正因为如此,Java中的Stack一直被认为是糟糕的实现,官方也将Stack标志为“弃用”(deprecated)。

Vector不行是因为效率不太行,很多方法都用了synchronized修饰,虽然线程安全,但是像ArrayDeque,LinkedList这些线程不安全的,在需要安全的时候也可以用Collections.synchronizedCollection()转化成线程安全的,所以Vector就没什么用处了。
综上所述,导致Stack糟糕实现的原因是Stack与Vector类的关系出现了错误,不应该是继承关系(is-a),而应是组合关系(has-a)。

4.1.1 简述Vector

关于Vector,参考:简述Vector_Archie敲键盘的博客-CSDN博客_vector 类 继承

5. 特点

1.插入、删除、获取操作支持两种形式:快速失败和返回null或true/false
2.既具有FIFO特点又具有LIFO特点,即是队列又是栈
3.不推荐插入null元素,null作为特定返回值表示队列为空
4.未定义基于元素相等的equals和hashCode

6. 实现

 java官方文档推荐用deque实现栈(stack)。
ArrayDeque: 基于数组实现的线性双向队列,通常作为栈或队列使用,但是栈的效率不如LinkedList高。

LinkedList: 基于链表实现的链式双向队列,通常作为栈或队列使用,但是队列的效率不如ArrayQueue高。

模拟队列——FIFO

Deque接口扩展(继承)了 Queue 接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 Queue 接口继承的方法完全等效于 Deque 方法,如下表所示:

模拟栈——LIFO

双端队列也可用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留 Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于 Deque 方法,如下表所示:

7. ArrayDeque与LinkList区别:

ArrayDeque:

  • 数组结构
  • 插入元素不能为null
  • 无法确定数据量时,后期扩容会影响效率

LinkList:

  • 链表结构
  • 插入元素能为null
  • 无法确定数据量时,有更好表现

ArrayDeque与LinkedList中插入null的差异:

最近做题时发现用ArrayDeque类插入null时会报NullPointerException的错误,而用LinkedList类则不会。查了下两个类实现offer方法的源码,发现ArrayDeque类里是对offer这个方法特意进行了是否为null的判断

而LinkedList类则没有进行这个判断

 

 

8. 常用方法

addFirst(): 向队头插入元素,如果元素为空,则发生NPE(空指针异常)

addLast(): 向队尾插入元素,如果为空,则发生NPE

offerFirst(): 向队头插入元素,如果插入成功返回true,否则返回false

offerLast(): 向队尾插入元素,如果插入成功返回true,否则返回false

removeFirst(): 返回并移除队头元素,如果该元素是null,则发生NoSuchElementException

removeLast(): 返回并移除队尾元素,如果该元素是null,则发生NoSuchElementException

pollFirst(): 返回并移除队头元素,如果队列无元素,则返回null

pollLast(): 返回并移除队尾元素,如果队列无元素,则返回null

getFirst(): 获取队头元素但不移除,如果队列无元素,则发生NoSuchElementException

getLast(): 获取队尾元素但不移除,如果队列无元素,则发生NoSuchElementException

peekFirst(): 获取队头元素但不移除,如果队列无元素,则返回null

peekLast(): 获取队尾元素但不移除,如果队列无元素,则返回null

pop(): 弹出栈中元素,也就是返回并移除队头元素,等价于removeFirst(),如果队列无元素,则发生NoSuchElementException

push(): 向栈中压入元素,也就是向队头增加元素,等价于addFirst(),如果元素为null,则发生NPE,如果栈空间受到限制,则发生IllegalStateException
 

9. 代码演示

private static void usingAsQueue() {Deque<Integer> queue=new ArrayDeque<>();System.out.println("队列为空:"+queue.isEmpty());   //判断队列是否为空queue.addLast(12);   //添加元素System.out.println("队列为空:"+queue.isEmpty());   //判断队列是否为空System.out.println(queue.peekFirst());   //获取队列首部元素System.out.println(queue.pollFirst());   //获取并移除栈顶元素System.out.println("队列为空:"+queue.isEmpty());   //判断队列是否为空}private static void usingAsStack() {//作为栈使用Deque<Integer> stack=new LinkedList<>();System.out.println("栈为空:"+stack.isEmpty());   //判断栈是否为空stack.addFirst(12);System.out.println("栈为空:"+stack.isEmpty());   //判断栈是否为空System.out.println(stack.peekFirst());   //获取栈顶元素System.out.println(stack.pollFirst());   //获取并移除栈顶元素System.out.println("栈为空:"+stack.isEmpty());   //判断栈是否为空System.out.println("============================================");


http://chatgpt.dhexx.cn/article/LaA4DvpL.shtml

相关文章

deque用法深度解析,一篇文章弄懂deque容器各种操作

&#x1f4cb; 前言 &#x1f5b1; 博客主页&#xff1a;在下马农的碎碎念✍ 本文由在下马农原创&#xff0c;首发于CSDN&#x1f4c6; 首发时间&#xff1a;2022/01/11&#x1f4c5; 最近更新时间&#xff1a;2022/01/11&#x1f935; 此马非凡马&#xff0c;房星本是星。向前…

未禁用nouveau导致Ubuntu安装Cuda的runfile安装方法出错:[ERROR]: Install of 455.32.00 failed, quitting

很多朋友在给Ubuntu&#xff08;Linux&#xff09;安装Cuda时&#xff0c;参考官方安装步骤导致安装出错&#xff1a; wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run sudo sh cuda_11.1.1_455.32.00_lin…

Ubuntu 安装 NVIDIA 显卡驱动详细步骤(ERROR: The Nouveau kernel driver is currently in use by your system)

1. 禁用 Nouveau 驱动 在禁用 Nouveau 驱动前我们先了解下它是啥&#xff1f;有什么作用。 Nouveau 是由第三方为 NVIDIA 显卡开发的一个开源 3D 驱动&#xff0c;也没能得到 NVIDIA 的认可与支持。虽然 Nouveau Gallium3D 在游戏速度上还远远无法和 NVIDIA 官方私有驱动相提…

Ubuntu 18.04 安装 nvidia 显卡驱动 离线安装 禁用 nouveau

Ubuntu 18.04 安装 nvidia 显卡驱动 离线安装 1 系统2 查看显卡2.1 更新 pci.ids 文件 3 安装显卡驱动 510.543.1 安装 nvtop 4 禁用 nouveau5 安装 cuda 11.6.15.1 设置环境变量 1 系统 # lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description:…

[Ubuntu]:禁用nouveau、安装卸载NVIDIA CUDA及驱动(深度学习)

这里只针对Ubuntu的安装卸载&#xff0c;安装驱动方式的不同&#xff0c;卸载也有些许不同。通常有3种方式&#xff1a; 通过apt包管理工具来安装&#xff0c; 这样的方式好处是卸载安装的管理跟其他软件一致 通过.deb包来安装&#xff0c;这里就跳过apt&#xff0c;直接使用了…

ubuntu18.04 禁用自带nouveau后重启无法进入系统

问题 按照链接步骤&#xff1a;禁用ubuntu 自带显卡驱动Nouveau&#xff0c; 又按照推荐安装驱动&#xff1a;$ sudo ubuntu-drivers autoinstall&#xff0c;重启电脑后&#xff0c;无法进入系统&#xff0c;一直重复停留在密码输入界面。 解决方法&#xff1a; 开机进入ubun…

Ubuntu20.04(18.04通用)禁用nouveau,安装NVIDIA显卡驱动

卸载其它版本NVIDIA驱动 sudo apt-get --purge remove nvidia*sudo apt autoremove禁掉nouveau 打开文本形式 sudo gedit /etc/modprobe.d/blacklist.conf 或直接终端打开形式 sudo vim /etc/modprobe.d/blacklist.conf sudo vi /etc/modprobe.d/blacklist.conf 在打开的文件…

已解决:ubuntu18.4禁用nouveau驱动(如何关闭secure boot)

在安装显卡驱动等过程中往往会需要禁用bios中的secure boot&#xff0c;因为secure boot会阻止第三方源安装驱动&#xff0c;只要保证安装源可靠&#xff0c;禁用并不会带来多大隐患。 1.开机在未亮屏之前反复按F2进入设置界面 2.取消勾选后退出重启 完成bios中的secure boot禁…

Ubuntu18.04禁用nouveau驱动,安装NVIDIA显卡驱动。

一、关闭secure boot&#xff0c;禁用nouveau驱动。 1.禁用bios中的secure boot&#xff0c;因为secure boot会阻止第三方源安装的驱动&#xff0c;禁用不会带来多大隐患。 2.禁用nouveau驱动&#xff0c;这是Ubuntu默认的开源显卡驱动&#xff0c;与N卡驱动一起使用会导致兼…

openEuler操作系统禁用 Nouveau

目录 一、什么是openEuler 二、什么是Nouveau 三、禁用Nouveau Liunx系统安装NVIDIA显卡驱动时需要禁用Nouveau&#xff0c;openEuler操作系统也不例外&#xff0c;但是网上openEuler操作系统如何禁用Nouveau的资料比较少&#xff0c;而且基本都不靠谱&#xff0c;我找到一个…

LWN:NVIDIA 与 nouveau!

关注了就能看到更多这么棒的文章哦&#xff5e; NVIDIA and nouveau By Jake EdgeOctober 5, 2022LPCDeepL assisted translationhttps://lwn.net/Articles/910343/ 英伟达图形加速硬件的源代码发不了&#xff0c;对人们来说这也许是一个惊喜&#xff1b;至少快速浏览下来&…

干掉Nouveau安装Linux Nvidia显卡驱动

干掉Nouveau安装Linux Nvidia显卡驱动 首先说明下什么是Nouveau&#xff0c;为什么有些系统安装N卡驱动的时候会提示“ERROR: The Nouveau kernel driver is currently in use by your system. This driver is incompatible with the NVIDIA driver……”之类的错误。 Nouvea…

centos7篇---禁用默认的驱动nouveau,安装cuda和cudnn

禁用默认的驱动nouveau&#xff0c;安装cuda和cudnn 硬件设施&#xff1a;1. 禁用默认的驱动nouveau2. 系统要求3. 软件更新4. 安装驱动5. 安装cuda6. 安装cudnn参考 硬件设施&#xff1a; centos7 NVidia显卡驱动&#xff1a;470.57 CUDA: 11.4.2 cuDNN: 8.2.4 1. 禁用默认…

ubuntu系统禁用自带Nouveau驱动

Nouveau是由第三方为NVIDIA显卡开发的一个开源3D驱动&#xff0c;让Linux更容易的应对各种复杂的NVIDIA显卡环境&#xff0c;安装完Linux系统即可进入桌面并且有不错的显示效果&#xff0c;所以&#xff0c;很多Linux发行版默认集成了Nouveau驱动&#xff0c;在使用NVIDIA显卡时…

Ubuntu20.04 系统禁用自带的Nouveau驱动

注&#xff1a;该博文所述的方法同样适用于Ubuntu16.04、Ubuntu18.04版本系统。 nouveau(英语&#xff1a;/nuːˈvoʊ/) 是一个自由开放源代码GPU驱动程序&#xff0c;是为Nvidia的GPU所编写&#xff0c;也可用于属于系统芯片的高通系列&#xff0c;此驱动程序是由一群独立的…

400错误

400 请求出错 由于语法格式有误&#xff0c;服务器无法理解此请求。不作修改&#xff0c;客户程序就无法重复此请求。 原因&#xff1a; 1、前端提交数据的字段名称或者是字段类型和后台的实体类不一致&#xff0c;导致无法封装&#xff1b; 2、前端提交的到后台的数据应该是…

springboot访问400错误,记录一下

1.界面显示 spring boot启动&#xff0c;ip加端口会默认访问index.html页面。浏览器中输入&#xff0c;显示如上。开始以为是没有新建index.html页面的原因。所以我就在templates下面新建了index.html页面&#xff0c;重启&#xff0c;再访问。发现还是显示如上。后来查找资料…

接口报400错误解析

原文地址&#xff1a; https://blog.csdn.net/lw1242189467/article/details/80048407 首先&#xff0c;遇到400问题&#xff0c;最大几率是出现了数据类型不一致的问题&#xff0c;简单来说是Controller层不用正确读取你发送请求附带的参数。该例是我前端传送JSON格式&#x…

tomcat自定义400错误页面

原文链接&#xff1a;https://aspiresoftware.in/blog/catalinatomcat-custom-error-report-valve-to-handle-errors-exceptions/ <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" …

java 400_Java项目报400错误的原因与解决方法

java项目中400错误介绍&#xff1a;(推荐&#xff1a;java视频教程) 400 Bad Request&#xff1a; 请求中的语法错误。Reason-Phrase应当标志这个详细的语法错误&#xff0c;比如”Missing Call-ID header field”。 HTTP 400 错误 - 请求无效 (Bad request) 在ajax请求后台数据…