Java双端队列ArrayDeque

news2024/9/21 16:49:04

概述

       双端队列ArrayDeque是Java集合框架中的一种数据结构,它实现了Deque接口,因此支持在两端进行添加和移除元素。通过名称也能看出,ArrayDeque是基于数组实现的,ArrayDeque内部使用一个可动态调整大小的环形数组来存储元素。当ArrayDeque中的元素数量超过当前数组容量时,会自动进行扩容,以确保有足够的空间存放新元素,但Java没有实现自动缩容。

环形数组

        队列是一种只能在头(head)取出元素,在尾(tail)插入元素的结构,ArrayDeque是基于数组实现的,数组不同于链表,它在取出元素后不会释放内存空间,随着元素的入队出队,数组前端浪费的空间将会越来越多,直至内存溢出。使用环形数组就能完美解决这个问题,ArrayDeque内部的的数组是一个逻辑上的环形数组,实际上与普通数组并无区别,通过一个头指针head和一个尾指针tail将数组模拟成逻辑上的环。

  • 队列新创建时head和tail都指向数组0下标:

  • 经过几次入队出队可能的情况:

  • tail到达数组末尾后继续入队,则会回到数组0下标,继续使用出队空出的空间:

        环形数组的使用过程就好像两个指针在一个环形的跑道上赛跑,当head追上tail时表示队列中已经没有元素了,当tail追上head(超了一圈)时就表示数组已满需要扩容了。head永远都不会超过tail。下面是ArrayDeque元素入队的源码:

public void addLast(E var1) {
    if (var1 == null) {
        throw new NullPointerException();
    } else {
        this.elements[this.tail] = var1;
        //扩容条件
        if ((this.tail = this.tail + 1 & this.elements.length - 1) == this.head) {
             this.doubleCapacity();//扩容方法
        }
    }
}

应用

        ArrayDeque实现了Deque接口,Deque又继承自Queue接口,ArrayDeque可以作为先进先出(FIFO)的队列使用,由于Java集合框架里的标准栈(Stack)性能不佳,已经作为遗留类被遗弃,官方推荐使用ArrayDeque作为栈实现。而ArrayDeque并不像Stack那样是标准的后进先出(LIFO)结构,如若需要,可以对ArrayDeque进行封装。以下是作为队列和栈的简单示例:

//作为队列
Queue<String> queue = new ArrayDeque<>();
//入队
queue.offer("1");
queue.offer("2");
queue.offer("3");
//出队
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
//输出1,2,3

Deque<String> stack = new ArrayDeque<>();
//压栈
stack.push("1");
stack.push("2");
stack.push("3");
//弹出栈顶元素
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
//输出3,2,1

ArrayDeque和LinkedList

        LinkedList也实现了Deque接口,可以作为队列或栈使用,区别在于ArrayDeque是基于数组的,LinkedList是基于链表的。作为队列或栈使用时,ArrayDeque和LinkedList性能相差不大,由于数组的地址空间是连续的,根据程序的局部性原理,ArrayDeque多数情况下可能会快一些,在做选择时可以优先考虑ArrayDeque。若还需要队列或栈之外的功能,则需要综合考虑,如:LinkedList实现了List接口,拥有Deque之外的很多功能,如果还需要用到List相关的功能,则优先考虑LinkedList。

总结

        ArrayDeque是Java标准库中提供的一种高性能的双端队列数据结构,它是Deque接口的一个典型实现。双端队列允许我们在队列的前端和后端进行元素的添加与移除操作,这为开发者在处理序列数据时提供了极大的灵活性。ArrayDeque的核心在于其内部实现了一个可动态调整大小的环形数组。这一设计精妙之处在于,通过使用模运算(取余),使得数组的存储空间可以循环利用,即使在元素不断添加和移除的情况下,也无需频繁地进行数组的复制和扩容,从而大大提高了数据结构的操作效率。
        在性能方面,ArrayDeque的插入(offer/put)和删除(poll/remove)操作都达到了平均O(1)的时间复杂度,这意味着无论是向队列的头部还是尾部添加或移除元素,其操作速度都非常快,这对于需要快速插入和删除的场景尤为重要,如实现各类栈、队列操作,以及在迭代器中的应用等。

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

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

相关文章

函数递归(上)

目录 1.递归是什么&#xff1f; 1.1 递归的思想&#xff1a; 2.顺序打印⼀个整数的每⼀位 ​编辑3 迭代 4.求第n个斐波那契数 1.递归是什么&#xff1f; 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。 #include <stdio.h…

【JAVA开源】基于Vue和SpringBoot的购物商城网站

本文项目编号 T 032 &#xff0c;文末自助获取源码 \color{red}{T032&#xff0c;文末自助获取源码} T032&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之扬帆移植案例

标准系统方案之扬帆移植案例 ​ 本文章是基于瑞芯微RK3399芯片的yangfan开发板&#xff0c;进行标准系统相关功能的移植&#xff0c;主要包括产品配置添加&#xff0c;内核启动、升级&#xff0c;音频ADM化&#xff0c;Camera&#xff0c;TP&#xff0c;LCD&#xff0c;WIFI&a…

高效财税自动化软件如何提升企业财务工作的效率与准确性

在当今企业运营中&#xff0c;财务管理发挥着核心作用。它不仅涉及企业正常运转和市场决策&#xff0c;还是推动企业向高质量发展迈进的关键动力。面对激烈的市场竞争与科技革新的双重挑战&#xff0c;财务管理亟需进行持续的转型与提升&#xff0c;为企业高质量发展目标的实现…

vue2.0+ts注册全局函数和几个递归查找

vue2.0ts注册全局函数和几个递归查找 一、main.ts 一、main.ts // 定义你的全局函数,判断是否有按钮权限 interface Item {label: string;checked: number;[k: string]: any; } // 获取按钮时候权限 function globalLable(arr: Item[], label: string): boolean {for (const i…

为大模型提供服务需要多少 GPU 显存?

在几乎所有的 LLM 面试中&#xff0c;有一个问题总是会被提及&#xff1a;“为大模型提供服务需要多少 GPU 显存&#xff1f;” 这不仅仅是一个随机的问题——它是一个关键指标&#xff0c;反映了你对这些强大模型在生产环境中部署和可扩展性的理解程度。 当你使用 GPT、LLaM…

在QSciscintilla编辑器源码中新增关键词分组的方法

由于项目需要&#xff0c;得在QSciscintilla的底层源码中增加几组关键词分组。在网上找了很久&#xff0c;一般都是说利用重写keywords(int set)接口的方式来增加&#xff0c;但这种方法不适用于我的应用场景。因为这种方法只能增加有限个关键词&#xff0c;且都是直接写死的方…

风电出海内幕:黄金期和内卷期共存

间歇性停战&#xff0c;持续性内卷&#xff0c;这就是中国风电。 9月4日&#xff0c;中国可再生能源学会风能专业委员会秘书长秦海岩发布文章《穿越周期&#xff0c;跨过险阻&#xff0c;中国风电的征途仍是星辰大海》。文章指出&#xff0c;中国风电行业正在重现十多年前的恶…

高中数学:立体几何-空间中点、直线、平面之间的位置关系

文章目录 1、空间中直线与直线的位置关系1、平行线传递性质2、定理3、空间直线夹角 2、空间中直线与平面的位置关系1、线面平行2、线面垂直 3、空间中平面与平面的位置关系1、面面平行2、二面角&#xff08;面与面的夹角&#xff09;3、面面垂直 4、补充 1、空间中直线与直线的…

新手也能快速上手!推荐这四款剪辑软件

在数字媒体日益盛行的今天&#xff0c;视频剪辑软件几乎成为了每一位视频创作者或媒体工作者必备的“十八般武艺”之一&#xff1b;用各种软件对影片、音乐进行精确到秒的剪切和调色&#xff0c;让我深刻体验到其功能的强大与方便&#xff0c;下面就为大家分享一下我在工作中常…

制造企业MES系统委外工单管理探析

一、委外工单管理的重要性 在制造企业的生产过程中&#xff0c;委外工单管理是一项重要且复杂的任务。委外加工是指企业将某些生产任务外包给外部供应商完成&#xff0c;以降低成本、提高效率或满足特定需求。然而&#xff0c;委外加工过程中往往存在诸多不确定性&#xff0c;…

【深度学习】(3)--损失函数

文章目录 损失函数一、L1Loss损失函数1. 定义2. 优缺点3. 应用 二、NLLLoss损失函数1. 定义与原理2. 优点与注意3. 应用 三、MSELoss损失函数1. 定义与原理2. 优点与注意3. 应用 四、BCELoss损失函数1. 定义与原理2. 优点与注意3. 应用 五、CrossEntropyLoss损失函数1. 定义与原…

C++(Qt)软件调试---断点高级用法(20)

C(Qt)软件调试—断点高级用法&#xff08;20&#xff09; 文章目录 C(Qt)软件调试---断点高级用法&#xff08;20&#xff09;[toc]1、概述2、断点高级用法1.1 条件断点1.2 日志断点/记录点/消息追踪点1.3 函数断点1.4 命中次数断点1.5 异常断点1.6 等待断点/触发断点1.7 临时断…

一台 Linux 同时 安装配置多个 python3 环境( 3.7 - 3.12 )

很多粉丝来信说&#xff1a;安装新 python3 环境&#xff0c;要卸载操作系统原来自带的 python。。。 博主再次声明&#xff1a;不需用搞复杂了&#xff0c;相反可以同时具备多个环境&#xff0c;也不需用配置环境变量 无图无真相&#xff0c;且看此图&#xff1a; 详情操作&am…

Android IME输入法启动显示隐藏流程梳理

阅读Android AOSP 12版本代码&#xff0c;对输入法IME整体框架模块进行学习梳理&#xff0c;内容包含输入法框架三部分IMM、IMMS、IMS的启动流程、点击弹出流程、显示/隐藏流程&#xff0c;以及常见问题和调试技巧。 1. IME整体框架​​​​​​​ IME整体分为三个部分&#xf…

python怎么打开文件对话框

可以使用tkinter.filedialog模块中的askopenfilename函数来实现&#xff0c;tkinter是python自带的GUI&#xff0c;通过askopenfilename函数打开选择文件对话框&#xff0c;代码如下&#xff1a; import tkinter.filedialog fntkinter.filedialog.askopenfilename(title选择一个…

HT366 具有防破音功能的免电感滤波2x20W D类立体声音频功放

特点 输出功率(BTL模式) 2x22W (VDD14V,RL4Ω,THDN10%) 输出功率(PBTL模式) 34W(VDD16V,RL4Ω,THDN10%) 单电源系统&#xff0c;4.5V-16V宽电压输入范围 ACF防破音功能可选 超过90%效率&#xff0c;无需散热器 可选输出模式:BD和ISPW 扩频功能&#xff0c;免电感滤波 模拟差分…

TMC4671——硬件矢量控制的伺服电机控制芯片

Trinamic研发的TMC4671为永磁同步电机、直流无刷电机、音圈电机、直流有刷电机和2相步进电机提供磁场定向控制&#xff0c;是一款完全集成伺服控制的芯片TMC4671凭借在牢固稳定的状态机中嵌入全部必要的控制回路来处理这大幅度降低能耗一市场需求的问题。 一. 嵌入式运动控制…

【机器学习】OpenCV高级图像处理

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 OpenCV高级图像处理图像滤波线性滤波高斯滤波均值滤波双边滤波 非线性滤波中值滤…