探索Java中的栈:Stack与Deque(ArrayDeque和LinkedList)
文章目录
- 1. 栈(Stack)
- 1.1 定义方式
- 1.2 特点
- 1.3 栈的层次结构
- 2. 双端队列(Deque)
- 2.1 定义方式及继承关系
- 2.2 特点:
- 2.3 ArrayDeque
- 2.4 LinkedList
- 2.5 Deque 的各种方法
- 2.6 如何选择ArrayDeque和LinkedList
- 3. 如何选择Stack和Deque
- 参考与推荐
在Java中,栈(Stack)是一种经常使用的数据结构,而Stack类和Deque接口是两种常见的实现方式。
1. 栈(Stack)
1.1 定义方式
在Java中,栈可以通过Stack类来实现。Stack类是Java集合框架的一部分,它实现了一个后进先出(LIFO)的数据结构。
import java.util.Stack;Stack<Integer> stack = new Stack<>();
1.2 特点
- 后进先出:Stack类是一个典型的后进先出(LIFO)数据结构,它的操作顺序是最后入栈的元素最先出栈。
- 基本操作:Stack类提供了一系列基本的操作方法,如push()(入栈)、pop()(出栈)、peek()(查看栈顶元素)等。
- 线程安全:Stack类是线程安全的,因此可以在多线程环境下使用。但在单线程环境下,通常建议使用性能更好的替代方案,如Deque接口的实现。
1.3 栈的层次结构
Stack类的层次结构:Java Collection 框架提供了一个 Stack 类,用于建模和实现 Stack 数据结构。该类也可以称为 Vector 的子类。

2. 双端队列(Deque)
2.1 定义方式及继承关系
双端队列(Deque)是一种更加通用的数据结构,它同时支持在队列两端进行插入和删除操作。在Java中,Deque是一个接口,它有多种实现方式,如ArrayDeque、LinkedList等。
import java.util.Deque;
import java.util.ArrayDeque;Deque<Integer> deque = new ArrayDeque<>();
继承关系图如下:

2.2 特点:
- 双端操作:Deque接口支持在队列两端进行插入和删除操作,因此具有更广泛的用途。
- 不限于LIFO:与Stack不同,Deque并不限定于后进先出(LIFO)的操作顺序,可以根据需要在队列的任意一端进行操作。
- 性能优化:Deque的实现通常会针对特定的操作进行性能优化,例如ArrayDeque使用数组实现,适用于大多数场景下的队列操作。
2.3 ArrayDeque
ArrayDeque是基于动态数组(或称为循环数组)实现的双端队列。它的内部实现使用数组作为底层数据结构,可以在队列的两端进行高效的插入和删除操作。
-
内部实现:ArrayDeque使用数组作为底层数据结构,动态调整数组大小以适应实际存储需求。它维护了两个指针,分别指向数组的头部和尾部,使得在两端进行插入和删除操作的时间复杂度为常数时间(O(1))。
-
性能:由于基于数组实现,ArrayDeque在随机访问和索引操作上具有较好的性能。在大多数情况下,ArrayDeque的性能比LinkedList更好。
-
适用场景:适用于需要高效随机访问和索引的场景。
2.4 LinkedList
LinkedList是基于双向链表实现的双端队列。它的内部实现使用链表作为底层数据结构,每个节点存储元素值以及指向前驱节点和后继节点的引用。
-
内部实现:LinkedList使用双向链表实现,每个节点存储元素值以及指向前驱节点和后继节点的引用。这种实现使得在队列的两端进行插入和删除操作的时间复杂度为常数时间(O(1))。
-
性能:由于基于链表实现,LinkedList在随机访问和索引操作上的性能相对较差,通常需要线性时间(O(n))。但在插入和删除操作上,特别是在中间位置,LinkedList的性能通常优于ArrayDeque。
-
适用场景:适用于需要频繁进行插入和删除操作,但对于随机访问和索引性能要求不高的场景。
2.5 Deque 的各种方法
- void addFirst(E e):将指定元素插入到队列的头部。
- void addLast(E e):将指定元素插入到队列的尾部。
- boolean offerFirst(E e):将指定元素插入到队列的头部,如果队列已满,则返回false。
- boolean offerLast(E e):将指定元素插入到队列的尾部,如果队列已满,则返回false。
- E removeFirst():移除并返回队列的头部元素,如果队列为空,则抛出异常。
- E removeLast():移除并返回队列的尾部元素,如果队列为空,则抛出异常。
- E pollFirst():移除并返回队列的头部元素,如果队列为空,则返回null。
- E pollLast():移除并返回队列的尾部元素,如果队列为空,则返回null。
- E getFirst():返回队列的头部元素,但不移除,如果队列为空,则抛出异常。
- E getLast():返回队列的尾部元素,但不移除,如果队列为空,则抛出异常。
- E peekFirst():返回队列的头部元素,但不移除,如果队列为空,则返回null。
- E peekLast():返回队列的尾部元素,但不移除,如果队列为空,则返回null。
- boolean removeFirstOccurrence(Object o):从队列中移除第一次出现的指定元素(从头部开始查找)。
- boolean removeLastOccurrence(Object o):从队列中移除最后一次出现的指定元素(从尾部开始查找)。
- void push(E e):将指定元素压入栈中,等效于addFirst()。
- E pop():从栈中弹出并返回栈顶元素,等效于removeFirst()。
除了上述方法外,Deque接口还继承了Queue接口中的方法,如offer()、poll()、remove()等,这些方法用于在队列的尾部进行插入和删除操作。
2.6 如何选择ArrayDeque和LinkedList
-
如果需要高效的随机访问和索引操作,并且队列大小是已知的或者稳定的,那么选择ArrayDeque更合适。
-
如果需要频繁在队列两端进行插入和删除操作,或者队列大小不确定或者需要动态调整,那么选择LinkedList更合适。
3. 如何选择Stack和Deque
-
如果只需要简单的栈操作,并且不需要对栈的性能进行特殊优化,那么使用Stack类是一个方便的选择。
-
如果需要更灵活的操作,或者需要在队列的两端进行插入和删除操作,那么使用Deque接口的实现可能更加合适。
参考与推荐
参考:
- Stack Class in Java
- Deque interface in Java with Example
推荐:
- springboot报错合集
- springboot 笔记
相关文章:
探索Java中的栈:Stack与Deque(ArrayDeque和LinkedList)
文章目录 1. 栈(Stack)1.1 定义方式1.2 特点1.3 栈的层次结构 2. 双端队列(Deque)2.1 定义方式及继承关系2.2 特点:2.3 ArrayDeque2.4 LinkedList2.5 Deque 的各种方法2.6 如何选择ArrayDeque和LinkedList 3. 如何选择…...
实践笔记-03 docker buildx 使用
docker buildx 使用 1.启用docker buildx2.启用 binfmt_misc3.从默认的构建器切换到多平台构建器3.1创建buildkitd.toml文件(私有仓库是http没有证书的情况下,需要配置)3.2创建构建器并使用新创建的构建器 4.构建多架构镜像并推送至harbor仓库…...
【数据结构与算法】之8道顺序表与链表典型编程题心决!
个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 目录 1、顺序表 1.1 合并两个有序数组 1.2 原地移除数组中所有的元素va…...
Go 源码之旅-开篇
欢迎来到《Go 源码之旅》专栏!在这个专栏中,我们将深入探索 Go 编程语言的内部数据结构的工作原理,一起踏上一段令人兴奋的源码之旅。 我们将一步步解析关键的数据结构底层工作原理以及一些常用框架的设计原理及其源码。 无论你是初学者还是…...
spring的事件推送
本质上是设计模式中的观察者模式。 一、什么是观察者模式 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。 二、什么是spring的事件推送 在 Spring 的事…...
计算机网络—HTTPS协议详解:工作原理、安全性及应用实践
🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:ヒューマノイド—ずっと真夜中でいいのに。 1:03━━━━━━️💟──────── 5:06 🔄 ◀️ ⏸…...
卫星遥感影像在农业方面的应用及评价
一、引言 随着科技的进步,卫星遥感技术在农业领域的应用越来越广泛。卫星遥感技术以其宏观、快速、准确的特点,为农业生产和管理提供了有力的技术支撑。本文将对卫星遥感在农业方面的应用进行详细介绍,并通过具体案例进行说明。 二、…...
docker pull镜像的时候指定arm平台
指定arm平台 x86平台下载arm平台的镜像包 以mysql镜像为例 docker pull --platform linux/arm64 mysqldocker images查看镜像信息 要查看Docker镜像的信息,可以使用docker inspect命令。这个命令会返回镜像的详细信息,包括其元数据和配置。 docker i…...
如何通过OceanBase V4.2 动态采样优化查询性能
OceanBase v4.2 推出了优化器动态采样的功能,在SQL运行过程中,该功能会收集需要的统计信息,协助优化器制定出更好的执行计划,进一步提升了查询性能。 影响查询性能的因素是什么?为何你的优化器效果不佳? …...
Vue3---基础1(认识,创建)
变化 相对于Vue2,Vue3的变化: 性能的提升 打包大小减少 41% 初次渲染快 55%,更新渲染快133% 内存减少54% 源码的升级 使用 proxy 代替 defineProperty 实现响应式 重写虚拟 DOM 的实现和 Tree-shaking TypeScript Vue3就可以更好的支持TypeSc…...
JAVA集合ArrayList
目录 ArrayList概述 add(element) 用法 add(index, element)用法 remove(element)用法 remove(index)用法 get(index)用法 set(index,element) 练习 test1 定义一个集合,添加字符串,并进行遍历&…...
Bitmap OOM
老机器Bitmap预读仍然OOM,无奈增加一段,终于不崩溃了。 if (Build.VERSION.SDK_INT < 21)size 2; 完整代码: Bitmap bitmap; try {//Log.e(Thread.currentThread().getStackTrace()[2] "", surl);URL url new URL(surl);…...
基于深度学习的人脸表情识别系统(PyQT+代码+训练数据集)
基于深度学习的人脸表情识别系统(PyQT代码训练数据集) 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现 前言 本项目是基于mini_Xception深度学习网络模型的人脸表情识别系统&#x…...
Qt 中的项目文件解析和命名规范
🐌博主主页:🐌倔强的大蜗牛🐌 📚专栏分类:QT❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、Qt项目文件解析 1、.pro 文件解析 2、widget.h 文件解析 3、main.cpp 文件解析 4、widget.cpp…...
【chatGPT】我:在Cadence Genus软件中,出现如下问题:......【4】
我 在Cadence Genus中,tcl代码为:foreach clk $clk_list{ set clkName [lindex $clk_list 0] set targetFreq [lindex $clk_list 1] set uncSynth [lindex $clk_list 4] set clkPeriod [lindex “%.3f” [expr 1 / $targetFreq]] … } 以上代码出现如下…...
单例模式(Singleton Pattern)在JAVA中的应用
在软件开发中,设计模式是解决特定问题的一种模板或者指南。它们是在多年的软件开发实践中总结出的有效方法。JAVA设计模式广泛应用于各种编程场景中,以提高代码的可读性、可维护性和扩展性。本文将介绍单例模式,这是一种常用的创建型设计模式…...
手把手教你创建新的OpenHarmony 三方库
创建新的三方库 创建 OpenHarmony 三方库,建议使用 Deveco Studio,并添加 ohpm 工具的环境变量到 PATH 环境变量。 创建方法 1:IDE 界面创建 在现有应用工程中,新创建 Module,选择"Static Library"模板&a…...
从零开始,如何成功进入IT行业?
0基础如何进入IT行业? 简介:对于没有任何相关背景知识的人来说,如何才能成功进入IT行业?是否有一些特定的方法或技巧可以帮助他们实现这一目标? 在当今数字化时代,IT行业无疑是一个充满活力和机遇的领域。…...
【数组】5螺旋矩阵
这里写自定义目录标题 一、题目二、解题精髓-循环不变量三、代码 一、题目 给定⼀个正整数 n,⽣成⼀个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正⽅形矩阵。 示例: 输⼊: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 二、解题精髓…...
Sora视频生成模型:开启视频创作新纪元
随着人工智能技术的飞速发展,视频生成领域也迎来了前所未有的变革。Sora视频生成模型作为这一领域的佼佼者,凭借其卓越的性能和创新的应用场景,受到了广泛的关注与好评。本文将对Sora视频生成模型进行详细介绍,带您领略其魅力所在…...
文献处理效率暴跌?NotebookLM Agent的3层语义理解架构,让PDF秒变可推理知识图谱!
更多请点击: https://intelliparadigm.com 第一章:文献处理效率暴跌?NotebookLM Agent的3层语义理解架构,让PDF秒变可推理知识图谱! 传统PDF阅读工具仅支持关键词检索与线性浏览,面对百页学术论文或跨领域…...
超长上下文处理能力翻倍,响应速度提升47%,API成本下降22%:Claude 3.5 Sonnet新功能落地实战手册,仅限本周内有效
更多请点击: https://intelliparadigm.com 第一章:Claude 3.5 Sonnet新功能概览与核心突破 Anthropic 正式发布的 Claude 3.5 Sonnet 在推理效率、多模态理解边界与开发者集成体验上实现了显著跃迁。相比前代,其上下文窗口稳定支持 200K tok…...
GitLab实战指南:从零到一的团队协作与项目管理
1. GitLab入门:从注册到组织搭建 第一次接触GitLab时,很多人会被它丰富的功能搞得晕头转向。作为一个长期使用GitLab管理技术团队的老鸟,我想分享一套真正实用的入门方法。GitLab本质上是一个集代码托管、项目管理、CI/CD于一体的DevOps平台&…...
DS4Windows终极指南:让PS4/PS5手柄在Windows上完美工作的完整教程
DS4Windows终极指南:让PS4/PS5手柄在Windows上完美工作的完整教程 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows DS4Windows是一款功能强大的开源工具,专门解决Pl…...
从Softmax到ArcFace:PyTorch实战解析人脸识别中的角度间隔损失函数
1. 从Softmax到ArcFace:人脸识别损失函数的进化之路 人脸识别技术如今已经深入到我们生活的方方面面,从手机解锁到机场安检,背后都离不开一个关键环节——如何让模型学会区分不同的人脸。这就像教小朋友认人一样,我们需要告诉模型…...
深入u-boot目录结构:以全志V3s的LicheePi Zero为例,理解每个文件夹的作用
深入解析u-boot目录结构:全志V3s平台下的LicheePi Zero实践指南 当你第一次打开u-boot源码仓库时,面对密密麻麻的目录结构可能会感到无从下手。作为嵌入式系统开发中至关重要的启动加载程序,u-boot的架构设计既体现了通用性又兼顾了平台特异…...
终局架构:指纹隔离底座 + gRPC分布式调度,重塑千万级拼多多店群RPA集群
大家好,我是林焱,一名专注电商底层业务逻辑与 RPA 自动化架构定制的独立开发者。 在前面的几篇 CSDN 专栏中,我们探讨了如何利用“指纹浏览器底层隔离”解决风控关联问题,如何利用“EDA(事件驱动)”和“CD…...
SLEICL框架:用“魔法书”提示工程提升小模型上下文学习性能
1. 项目概述:用“魔法书”解锁小模型的大潜能 如果你最近在折腾大语言模型,尤其是那些参数规模在7B、13B左右的“小模型”,可能会发现一个头疼的问题:想让它们通过上下文学习(In-context Learning, ICL)的方…...
Qt QColumnView实战:手把手教你打造一个macOS Finder风格的文件浏览器
Qt QColumnView实战:从零构建macOS风格文件浏览器 在桌面应用开发中,文件浏览器的实现一直是开发者面临的经典挑战。传统方案往往采用QTreeView或QListView,但它们难以还原macOS Finder那种优雅的列式导航体验。这正是QColumnView的用武之地—…...
Universal Data Tool 新功能解析:骨骼姿态标注与数据格式转换实战
1. 项目概述:一个数据标注工具的进化最近在整理一个计算机视觉项目的数据集时,我又一次打开了Universal Data Tool(UDT)。这个工具我用了快两年了,从它早期版本支持基础的图像分类和物体检测框标注开始,就一…...
