探索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视频生成模型进行详细介绍,带您领略其魅力所在…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...