Java数据结构(6)-ArrayDeque

【Java集合】ArrayDeque源码解读 双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列。ArrayDeque是一种以循环数组方式实现的双端队列,它是非线程安全的。它既可以作为队列也可以作为栈。 阅读详情

前两篇讲过,ArrayList使用数组性能很高,LinkedList更擅长处理头部数据。而ArrayDeque即使用数组,又擅长处理头部数据。相关特点前面章节已经详细介绍过,所以,要理解ArrayDeque,请先理解前几篇文章的内容。

双端队列

上一篇讲过,LinkedList用链表实现了Deque,即双端队列。ArrayDeque则用数组实现了Deque,Deque用法参考第5篇结尾。现在eclipse中调试以下代码

		ArrayDeque deque = new ArrayDeque();  
		System.out.println("断点1");
		deque.add(1);
		System.out.println("断点2");
		for(int i=2;i<14;i++){
			deque.add(i);
		}
		System.out.println("断点3");
		deque.addFirst(0);
		System.out.println("断点4");
		deque.addFirst(-1);
		System.out.println("断点5");
		deque.addFirst(-2);
		System.out.println("断点6");
  • 断点1:和ArrayList一样,它用一个数组参数element来存储数据,默认初始容量是16。也和LinkedList一样,用两个参数来记录头部和尾部,即head和tail,初始都是0,此时没有添加数据。

  • 断点2:添加第一个数据,和ArrayList一样默认在尾部添加。此时头部head仍然是0,而尾部tail变成了1,即下一次的添加位置。


  • 断点3:此时共添加了13条数据,tail指向坐标13,head仍然是0。


  • 断点4:重点来了,现在不再使用add()从尾部添加,而是用addFirst(0)从头部添加。注意:head头部变成了15,新添加的数据存储到了这里。此时队列头部第一个数据是位置15,第二个数据是位置0,第三个是位置1,有点像循环队列。这样就无需像ArrayList那样移动之前的数据了,从而实现了数组高效的从头部添加数据。

  • 断点5:继续从头部添加,添加到了倒数第二的位置,同上面的原理一样,之前的数据完全不需要移动。

  • 断点6:仍然从头部添加,显然会添加到倒数第三的位置,此时整个数组被填满。容量从16扩容为32,即按2倍容量扩容。注意:扩容时会进行数据整理,最后从头部添加的三个数据本来是在数组结尾,现在移动到了头部,成了真正的头部,如下图,head和tail也相应变成0和16。


先删后增

上面解释了,从头部添加,实际上会添加到数组结尾。但并不是任何时候都是这样。调试以下代码
		ArrayDeque deque = new ArrayDeque();  
		deque.add(1);
		deque.add(2);
		deque.add(3);
		deque.add(4);
		deque.add(5);
		deque.poll();
		deque.poll();
		System.out.println("断点1");
		deque.addFirst(0);
		System.out.println("断点2");
  • 断点1:先添加5条数据,然后使用poll方法从头部取出两条数据,也就是删除。删除其实就是赋null值。

  • 断点2:此时再执行addFirst()从头部添加,不会再添加到结尾,而是添加到了之前头部的前面。因此,无论怎么添加和删除,队列数据始终都是连续的。


数组容量

前面说过,ArrayDeque的数组默认长度是16。也可以像ArrayList那样,在初始时设置一个参数,直接分配较大的容量,以解决反复扩容的性能开销。我现在随便设置一个数字,如19。如下

ArrayDeque deque = new ArrayDeque(19);  

通过调试发现,此时数组elements的长度并不是19,而是32。因为其长度有一定限制标准,最小是8,只能按8的2倍长度扩容,所以其长度只能是8、16、32、64、128等。当设置参数为19时,它的长度会是其中一个刚刚大于19的数字,即32。因为这样的数字适合进行一些二进制运算,ArrayDeque正是通过相关的二进制算法来进行定位,以及确定何时扩容、何时循环链表等。这里不多讨论,知道即可。

ArrayDeque特性和场景

  • 和LinkedList一样,记录了头和尾的位置,擅长处理头部和尾部的数据,适用于栈和队列。但是并没有提供查询和处理其他位置数据的方法,不像ArrayList可以适应通用场景。
  • 由于使用数组,而且不需要移动位置,性能肯定高于LinkedList。上一篇已经解释过原因。另外,jdk官方文档上也明确指出,当用于队列时,ArrayDeque比LinkedList更快。
  • 当删除大量数据时,数组容量不会缩小,删除的位置仍然会赋null值。如果之后又没有足够的数据添加进来,大量的null会让费大量内存。而LinkedList每个结点被删除后,都会单独被内存回收,不会一直占用内存。
  • 数组初始长度为16,最小只能指定为8,原因上面已经说了。假如数组中只有一个元素,仍然会占用8个内存位置。如果要创建大量这样的数组,同样非常让费内存。ArrayList可以指定任意长度,不存在这样的问题。LinkedList每个结点是独立创建的,不会占用多余空间,也不存在这样的问题。
一文带你弄懂thermal governor IPA 当current temp < target temp时,使用k_pu,当current temp >= target temp时,使用k_po。如果current_temperature = switch_on_temp时,则k_p = k_pu,这时Pmax。如果current_temperature = target_temp时,则k_p = k_po,这时Pmax。2、解析dts,获得switch_on_temp和target_temp。3、初始化k_pu/k_po/k_i/k_d的常数。 阅读详情

相关推荐

CAD制图

CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。·CAD三维开发是指使用计算机程序和工具来创建、编辑和操作三维模型、图形和设计的过程。它在工程、建筑、制造和游戏等领域广泛应用。CAD三维开发可能涉及到复杂的图形算法、性能优化、并行计算等方面的内容,因此需要深入学习和实践,以提高开发的效率和质量。

RZer的博客 1655

ArrayDeque详解

美人如斯! ArrayDeque是java中对双端队列的线性实现 一.特性 无容量大小限制,容量按需增长; 非线程安全队列,无同步策略,不支持多线程安全访问; 当用作栈时,性能优于Stack,当用于队列时,性能优于LinkedList 两端都可以操作 具有fail-fast特征 不能存储null 支持双向迭代器遍历 注意: ArrayDeque的迭代器和大多数容器迭代器一样,都是快速失败(f...

weixin_34348805的博客 784

Python + OpenCV 计算视频中运动最慢小球的坐标验证码

本文提出一种基于Python和OpenCV的视频分析方法,用于检测多个运动小球中最慢运动目标的坐标。方法主要包括:1) 通过背景差分和形态学处理提取运动前景;2) 基于轮廓面积和圆形度筛选候选小球;3) 利用图像矩计算小球质心坐标;4) 通过近邻关联构建运动轨迹;5) 根据轨迹平均速度确定最慢目标。该方法能有效处理包含线条干扰和静态大圆干扰的背景,稳定输出最慢小球的中心坐标。实验结果表明,该方法能准确识别运动最慢的小球并定位其位置。

码王吴彦祖的博客 116

Java容器类详解 ArrayDeque详解

ArrayDeque是JDK容器中的一个双端队列实现,内部使用数组进行元素存储,不允许存储null值,可以高效的进行元素查找和尾部插入取出,是用作队列、双端队列、栈的绝佳选择,性能比LinkedList还要好。听到这里,不熟悉ArrayDeque的你是不是有点尴尬?JDK中竟然还有这么好的一个容器类?别慌,现在了解还来得及,趁响指还没有弹下去,快上车吧,没时间解释了。来看一个ArrayDeque的使用小栗子:// 初始化容量为4//添加元素// 获取元素。

yygr的博客 3630

五步教你用GPT-5画出国自然技术路线图!轻松节省80%画图时间(附AI提示词)

七哥给大家推荐的高校都在用的AI平台——高级学术版专业应用平台,集成了ChatGPT、Claude、Gemini、Grok等Al大模型的PLUS版本平台,包括 ChatGPT-5、4o、o3、4.1、4.5、Gemini 2.5 Pro、Claude 3.7、Claude 4、DeepSeek 满血版、Grok 3 、Grok 4等原生线路,还有国际主流的GPTs学术应用,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。

智能AI让学术科研更容易 1503

基于STM32、HAL库的WF162A 11BA T&R气压传感器 驱动程序设计

/ 转换为7位地址。* @param temperature: 存储读取到的温度值(°C)* @param temperature: 存储读取到的温度值(°C)* @param pressure: 存储读取到的压力值(bar)* @param pressure: 存储读取到的压力值(bar)* @param range: 压力范围(bar)

corlin6688的博客 363

集合框架之ArrayDeque类详解

Java集合框架分析(Deque)———ArrayDeque类详解 目录 一.数据结构 二.类标题 三.字段 四.构造函数 五.方法分析 类型 方法 作用 添加元素 public void addFirst(E e) 在数组前面添加元素 pu

妙乌的博客 1万+

天爱验证码wasm验证码逆向

本文分析了某网站采用WASM加密技术的情况,发现其加密方式主要针对data和轨迹信息,整体加密逻辑变化不大。通过反混淆技术可以还原代码,并确认加密过程分为两步:先对原始参数逐个加密,再调用WASM模块进行最终加密。研究发现关键参数drives和ki都存储在WASM模块内,通过提取wasm_exec.js文件即可直接使用该加密功能。本文仅提供技术研究思路,强调严禁用于任何违法行为。

码王吴彦祖的博客 937

java的Deque栈_在Java中使用ArrayDeque创建堆栈和队列

使用ArrayDeque创建一个堆栈。Deques=newArrayDeque();//堆栈s.push("Bat");s.push("Mat");s.push("Cat");s.push("Rat");s.push("Hat");s.push("Fat");使用ArrayDeque创建队列-Dequeq=newArrayDeque();//队列q.add("Bat");q.add...

weixin_33042645的博客 503

【24E】SWT6652 wifi驱动加载失败问题分析及解决方案

修改驱动配置Kconfig。是由于内存分配失败导致。

wgl307293845的博客 219

104、线缆与终端匹配:特性阻抗、双绞线规格与端接电阻优化策略

摘要: CAN总线物理层可靠性取决于线缆特性阻抗、双绞线规格与终端电阻的精准匹配。核心要点包括: 特性阻抗须严格匹配120Ω(±10%),反射系数需≤0.05,线缆建议选用Belden 3086A等实测达标型号,避免网线替代; 双绞线应选AWG22~24纯铜线,绞距≤30mm,工业环境需屏蔽层单端接地,杜绝铜包铝线; 终端电阻需选用金属膜电阻(0.5W以上),阻值按实测线缆阻抗微调,长距离可采用分裂终端(60Ω+4.7nF)优化信号完整性; 拓扑适配:星型/树型拓扑需控制分支长度,环型拓扑必须断开; 实测验

2401_88858637的博客 53

java数据结构之双端队列ArrayDeque

java 自带双端队列ArrayDeque的源码解析

冰血ANG的博客 3500

电阻抗成像肺功能测试数据分析与直方图生成

本文介绍了基于MATLAB的电阻抗成像(EIT)肺功能测试数据分析方法。研究针对32×32像素的EIT图像序列,通过三步算法处理:首先计算特定时间点与谷值图像的差值,然后分析1秒后峰值与1秒值的差值,最终计算比值矩阵并处理异常值。系统展示了数据预处理、关键时间点检测、比值计算及统计分析的全流程,包括生成概率分布直方图和空间分布图等可视化方法。该分析为无创肺功能评估提供量化指标,可应用于临床呼吸监测和疾病诊断。

huanghm88的专栏 198

Java数据结构 -ArrayDeque 双端队列的简单分析

一、队列 队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 二、双端队列 双端队列是只既可以在表的前端进行插入和删除操作,又可以在表的后端进行插入和删除操作。 三、ArrayDeque的实现 Java中的双端队列是用数组实现的,类的全限名称是jav

Android移动开发者的专栏 1772

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java数据结构-栈、队列常用类(Stack、ArrayDeque、LinkedLList)

在Java中,数组这种数据结构有专门的实现:不可变数组(int [] array={})、可变数组(ArrayList),同样的链表这种数据结构也有专门的实现类(LinkedList),这些实现类都是java封装好的类,开箱即用。由于LinkedList与ArrayDeque都是实现了Deque接口,因此这两个类中定义的方法几乎完全相同,因此这两个类的用法也几乎没有什么差异,虽然对于使用者而言,用这两个类都可以轻而易举的实现栈、队列的功能。返回的数组的运行时类型是指定数组的运行时类型。

qq_42681787的博客 3347

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深度剖析Java数据结构之队列(一)——双端队列(ArrayDeque)

一、队列 队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 二、双端队列 双端队列是只既可以在表的前端进行插入和删除操作,又可以在表的后端进行插入和删除操作。 三、ArrayDeque的实现 Java中的双端队列是用数组实现的,类的全限名...

diaogan4202的博客 238

Java数据结构详解(十)-ArrayDeque

ArrayDequeArrayDeque是一个循环数组.只要数组不被填满,ArrayDeque就可以不用扩容.组的任何一点都可能被看作起点或者终点.ArrayDeque是Deque 接口的大小可变数组的实现。数组双端队列没有容量限制;它们可根据需要增加以支持使用。它们不是线程安全的;在没有外部同步时,它们不支持多个线程的并发访问。禁止 null 元素。此类很可能在用作堆栈时快于 Stack,在用作队

Smart-YI 413

Java常见集合的数据结构流程解析 - HashMap红黑树、PriorityQueue优先队列、ArrayDeque双向循环数组

目录 一、集合常用属性对比表 二、PriorityQueue之构造堆 三、ArrayDeque之双向循环数组 四、HashMap之哈希表+链表+红黑树 五、TreeMap之序列集合转变为红黑树 一、集合常用属性对比表 集合 默认长度 容量增长方式 数据结构 空值null 线程安全 ArrayList 10 增长为当

Armyyyyy丶的博客 661

Java之ArrayDeque

文章目录一、底层数据结构 一、底层数据结构 // 构造方法 public ArrayDeque() { elements = (E[]) new Object[16]; } 该队列是基于数组实现的. 二、方法思维导图 三、 部分方法的源代码 1.add public boolean add(E e) { addLast(e); retur...

csdnLeraner的博客 550

深度剖析Java数据结构之双端队列(ArrayDeque)

一、队列 队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 二、双端队列 双端队列是只既可以在表的前端进行插入和删除操作,又可以在表的后端进行插入和删除操作。 三、ArrayDeque的实现 Java中的双端队列是用数组实现的,类的全限名称是jav

244

ArrayDeque双端队列--底层原理可视化

ArrayDeque是基于循环数组的双端队列实现,既可用作队列(FIFO)也可用作栈(LIFO)。通过两个索引headtail和位运算自动在固定大小(2 的幂)的底层数组中“回绕”操作,当空间用尽时再将数组容量翻倍并平铺原有元素,所有入、删、取操作均为摊销 O(1),不支持存放null且非线程安全,但因无额外节点指针、缓存友好,通常比链表结构性能更优。通过这篇文章,从栈功能使用到底层原理基本掌握,对ArrayDeque队列操作功能感兴趣的可以自行学习,底层和栈功能是共用的,相信你很快便可掌握双端队列。

qq_35485206的博客 981

Java 数据结构 -- 20.Java 8 数据结构补充介绍 ArrayDeque

前言 书接上文,上一篇对 EnumMap 进行了介绍与分析,本篇将对 ArrayDeque 进行介绍与分析。 还是先来看一下 ArrayDeque 的继承关系图: 可以看到它与其他数据结构不同的地方主要是实现了双端队列(Deque 接口)。 由于 ArrayDeque 可以作为一个栈使用,所以在查看 ArrayDeque 之前先来看一下 Stack 的源码。 /** * Stack 类代表了一...

wufeiova的博客 455

数据结构与算法(四)队列和 Java ArrayDeque 源码剖析

本文主要包括以下内容: 队列基本概念 队列的相关操作 队列的顺序存储 循环队列 队列的链式存储 Java LinkedList中的双端队列 Java ArrayDeque源码分析 ArrayDeque双端队列 ArrayDeque循环队列 位运算与取模(%) ArrayDeque扩容机制 ArrayDeque使用方法总结 如果对队列的基本概念、相关操作、顺序存储链式存储、循环队列等比较熟...

Chiclaim 1867

Java常用数据结构

Java数据结构,栈、链表、队列的选择

功不唐捐,玉汝于成 372
上一篇: Java数据结构(5)-LinkedList
下一篇: spring boot2 (25)-RestTemplate客户端
free_java
博客等级 码龄10年 664粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值