当前位置: 首页 > news >正文

探索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 的各种方法

  1. void addFirst(E e):将指定元素插入到队列的头部。
  2. void addLast(E e):将指定元素插入到队列的尾部。
  3. boolean offerFirst(E e):将指定元素插入到队列的头部,如果队列已满,则返回false。
  4. boolean offerLast(E e):将指定元素插入到队列的尾部,如果队列已满,则返回false。
  5. E removeFirst():移除并返回队列的头部元素,如果队列为空,则抛出异常。
  6. E removeLast():移除并返回队列的尾部元素,如果队列为空,则抛出异常。
  7. E pollFirst():移除并返回队列的头部元素,如果队列为空,则返回null。
  8. E pollLast():移除并返回队列的尾部元素,如果队列为空,则返回null。
  9. E getFirst():返回队列的头部元素,但不移除,如果队列为空,则抛出异常。
  10. E getLast():返回队列的尾部元素,但不移除,如果队列为空,则抛出异常。
  11. E peekFirst():返回队列的头部元素,但不移除,如果队列为空,则返回null。
  12. E peekLast():返回队列的尾部元素,但不移除,如果队列为空,则返回null。
  13. boolean removeFirstOccurrence(Object o):从队列中移除第一次出现的指定元素(从头部开始查找)。
  14. boolean removeLastOccurrence(Object o):从队列中移除最后一次出现的指定元素(从尾部开始查找)。
  15. void push(E e):将指定元素压入栈中,等效于addFirst()。
  16. 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. 栈&#xff08;Stack&#xff09;1.1 定义方式1.2 特点1.3 栈的层次结构 2. 双端队列&#xff08;Deque&#xff09;2.1 定义方式及继承关系2.2 特点&#xff1a;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文件&#xff08;私有仓库是http没有证书的情况下&#xff0c;需要配置&#xff09;3.2创建构建器并使用新创建的构建器 4.构建多架构镜像并推送至harbor仓库…...

【数据结构与算法】之8道顺序表与链表典型编程题心决!

个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 目录 1、顺序表 1.1 合并两个有序数组 1.2 原地移除数组中所有的元素va…...

Go 源码之旅-开篇

欢迎来到《Go 源码之旅》专栏&#xff01;在这个专栏中&#xff0c;我们将深入探索 Go 编程语言的内部数据结构的工作原理&#xff0c;一起踏上一段令人兴奋的源码之旅。 我们将一步步解析关键的数据结构底层工作原理以及一些常用框架的设计原理及其源码。 无论你是初学者还是…...

spring的事件推送

本质上是设计模式中的观察者模式。 一、什么是观察者模式 观察者模式是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;其所有依赖者都会收到通知并自动更新。 二、什么是spring的事件推送 在 Spring 的事…...

计算机网络—HTTPS协议详解:工作原理、安全性及应用实践

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;ヒューマノイド—ずっと真夜中でいいのに。 1:03━━━━━━️&#x1f49f;──────── 5:06 &#x1f504; ◀️ ⏸…...

卫星遥感影像在农业方面的应用及评价

一、引言 随着科技的进步&#xff0c;卫星遥感技术在农业领域的应用越来越广泛。卫星遥感技术以其宏观、快速、准确的特点&#xff0c;为农业生产和管理提供了有力的技术支撑。本文将对卫星遥感在农业方面的应用进行详细介绍&#xff0c;并通过具体案例进行说明。 二、…...

docker pull镜像的时候指定arm平台

指定arm平台 x86平台下载arm平台的镜像包 以mysql镜像为例 docker pull --platform linux/arm64 mysqldocker images查看镜像信息 要查看Docker镜像的信息&#xff0c;可以使用docker inspect命令。这个命令会返回镜像的详细信息&#xff0c;包括其元数据和配置。 docker i…...

如何通过OceanBase V4.2 动态采样优化查询性能

OceanBase v4.2 推出了优化器动态采样的功能&#xff0c;在SQL运行过程中&#xff0c;该功能会收集需要的统计信息&#xff0c;协助优化器制定出更好的执行计划&#xff0c;进一步提升了查询性能。 影响查询性能的因素是什么&#xff1f;为何你的优化器效果不佳&#xff1f; …...

Vue3---基础1(认识,创建)

变化 相对于Vue2&#xff0c;Vue3的变化&#xff1a; 性能的提升 打包大小减少 41% 初次渲染快 55%&#xff0c;更新渲染快133% 内存减少54% 源码的升级 使用 proxy 代替 defineProperty 实现响应式 重写虚拟 DOM 的实现和 Tree-shaking TypeScript Vue3就可以更好的支持TypeSc…...

JAVA集合ArrayList

目录 ArrayList概述 add(element) 用法 add(index, element)用法 remove&#xff08;element&#xff09;用法 remove&#xff08;index&#xff09;用法 get(index)用法 set(index,element) 练习 test1 定义一个集合&#xff0c;添加字符串&#xff0c;并进行遍历&…...

Bitmap OOM

老机器Bitmap预读仍然OOM&#xff0c;无奈增加一段&#xff0c;终于不崩溃了。 if (Build.VERSION.SDK_INT < 21)size 2; 完整代码&#xff1a; Bitmap bitmap; try {//Log.e(Thread.currentThread().getStackTrace()[2] "", surl);URL url new URL(surl);…...

基于深度学习的人脸表情识别系统(PyQT+代码+训练数据集)

基于深度学习的人脸表情识别系统&#xff08;PyQT代码训练数据集&#xff09; 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现 前言 本项目是基于mini_Xception深度学习网络模型的人脸表情识别系统&#x…...

Qt 中的项目文件解析和命名规范

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、Qt项目文件解析 1、.pro 文件解析 2、widget.h 文件解析 3、main.cpp 文件解析 4、widget.cpp…...

【chatGPT】我:在Cadence Genus软件中,出现如下问题:......【4】

我 在Cadence Genus中&#xff0c;tcl代码为&#xff1a;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中的应用

在软件开发中&#xff0c;设计模式是解决特定问题的一种模板或者指南。它们是在多年的软件开发实践中总结出的有效方法。JAVA设计模式广泛应用于各种编程场景中&#xff0c;以提高代码的可读性、可维护性和扩展性。本文将介绍单例模式&#xff0c;这是一种常用的创建型设计模式…...

手把手教你创建新的OpenHarmony 三方库

创建新的三方库 创建 OpenHarmony 三方库&#xff0c;建议使用 Deveco Studio&#xff0c;并添加 ohpm 工具的环境变量到 PATH 环境变量。 创建方法 1&#xff1a;IDE 界面创建 在现有应用工程中&#xff0c;新创建 Module&#xff0c;选择"Static Library"模板&a…...

从零开始,如何成功进入IT行业?

0基础如何进入IT行业&#xff1f; 简介&#xff1a;对于没有任何相关背景知识的人来说&#xff0c;如何才能成功进入IT行业&#xff1f;是否有一些特定的方法或技巧可以帮助他们实现这一目标&#xff1f; 在当今数字化时代&#xff0c;IT行业无疑是一个充满活力和机遇的领域。…...

【数组】5螺旋矩阵

这里写自定义目录标题 一、题目二、解题精髓-循环不变量三、代码 一、题目 给定⼀个正整数 n&#xff0c;⽣成⼀个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的正⽅形矩阵。 示例: 输⼊: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 二、解题精髓…...

Sora视频生成模型:开启视频创作新纪元

随着人工智能技术的飞速发展&#xff0c;视频生成领域也迎来了前所未有的变革。Sora视频生成模型作为这一领域的佼佼者&#xff0c;凭借其卓越的性能和创新的应用场景&#xff0c;受到了广泛的关注与好评。本文将对Sora视频生成模型进行详细介绍&#xff0c;带您领略其魅力所在…...

OpenAI现已普遍提供带有视觉应用程序接口的GPT-4 Turbo

OpenAI宣布&#xff0c;其功能强大的GPT-4 Turbo with Vision模型现已通过公司的API全面推出&#xff0c;为企业和开发人员将高级语言和视觉功能集成到其应用程序中开辟了新的机会。 PS&#xff1a;使用Wildcard享受不受网络限制的API调用&#xff0c;详情查看教程 继去年 9 月…...

Swift中的元组属性

在Swift中&#xff0c;元组属性指的是一个元组作为结构体、类或枚举的属性。可以将一个元组作为属性来存储和访问多个值。 例如&#xff0c;考虑以下的Person类&#xff1a; class Person {var name: Stringvar age: Intvar address: (String, Int)init(name: String, age: I…...

【go从入门到精通】作用域,包详解

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…...

利用SARscape对日本填海造陆和天然气开采进行地表形变监测

日本千叶市&#xff0c;是日本南部重要的工业港市。位于西部的浦安市是一个典型的"填海造田"城市&#xff0c;东南部的东金区有一片天然气开采区域&#xff0c;本文利用SARscape&#xff0c;用干涉叠加的方法&#xff0c;即PS和SBAS&#xff0c;对这两个区域进行地表…...

“Python爬虫实战:高效获取网上公开美图“

如何通过Python创建一个简单的网络爬虫&#xff0c;以爬取网上的公开图片。网络爬虫是一种自动化工具&#xff0c;能够浏览互联网、下载内容并进行处理。请注意&#xff0c;爬取内容时应遵守相关网站的使用条款&#xff0c;尊重版权和隐私权。 ### 网络爬虫简介 网络爬虫&…...

C++设计模式:享元模式(十一)

1、定义与动机 概述&#xff1a;享元模式和单例模式一样&#xff0c;都是为了解决程序的性能问题。面向对象很好地解决了"抽象"的问题&#xff0c;但是必不可免得要付出一定的代价。对于通常情况来讲&#xff0c;面向对象的成本大豆可以忽略不计。但是某些情况&#…...

【三十六】【算法分析与设计】综合练习(3),39. 组合总和,784. 字母大小写全排列,526. 优美的排列

目录 39. 组合总和 对每一个位置进行枚举 枚举每一个数出现的次数 784. 字母大小写全排列 526. 优美的排列 结尾 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不…...

ARM Cordio WSF(一)——架构简介

1. 关于WSF WSF&#xff08;wireless Software Foundation API&#xff09;&#xff0c;是一个RTOS抽象层。Wireless Software Foundation software service and porting layer&#xff0c;提供实时操作系统所需的基础服务&#xff0c;可基于不同平台进行实现&#xff0c;移植…...

设计模式总结-装饰者模式

模式动机 一般有两种方式可以实现给一个类或对象增加行为&#xff1a; 继承机制&#xff0c;使用继承机制是给现有类添加功能的一种有效途径&#xff0c;通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的&#xff0c;用户不能控制增…...

Stunnel网络加密服务

简介&#xff1a; Stunnel是一个用于创建SSL加密隧道的工具&#xff0c;针对本身无法进行TLS或SSL通信的客户端及服务器&#xff0c;Stunnel 可提供安全的加密连接。可以用于保护服务器之间的通信。您可以在每台服务器上安装Stunnel&#xff0c;并将其配置为在公网上加密传输数…...

济南营销网站制作/网站排名优化+o+m

用心爱孩子|专业做教育为切实抓好园所的教育教学工作&#xff0c;通过教师公开课&#xff0c;组织教师进行观摩学习&#xff0c;开展教学经验交流&#xff0c;充分发挥教师的专业引领作用及教师之间的“传、帮、带”作用&#xff0c;让广大教师互通有无&#xff0c;取长补短&am…...

网站怎么做sitemap/百度竞价专员

一、控制结构 sk_buff 和网络报文的存储空间 二、分片的网络报文与scatter/gather IO 网络报文在内存中不一定是连续存储的&#xff0c;同一个网络报文有可能被分成几片存放在内存的不同位置&#xff08;不要和IP分片混淆&#xff0c;IP分片是将一个网络报文分成多个网络报文&a…...

福州建设注册中心网站/关键词查询网

DateTime.Now;//当前时间 DateTime.AddDays(1)&#xff1b;//明天时间 eg&#xff1a; DateTime str DateTime.Now; DateTime str2 str.AddDays(1);...

咔咔做受视频网站/全网热度指数

Python的安装登录官网&#xff1a;www.python.org&#xff0c;选择版本3.6.4进行下载(下文中皆以MacOS为例)并安装。 PyCharm的安装登录网址&#xff1a;www.jetbrains.com&#xff0c;选择专业版进行下载并安装。 激活PyCharm时&#xff0c;在License Server中填入&#xff1a…...

网络规划设计师历年真题及答案/廊坊推广seo霸屏

一、何谓ASP缓存/为什么要缓存  当你的web站点采用asp技术建立的初期&#xff0c;可能感觉到的是asp动态网页技术带来的便利性&#xff0c;以及随意修改性、自如的http控制。但是&#xff0c;随着访问量的增加&#xff0c;你一定会发现自己的站点访问速度越来越慢&#xff0c…...

seo网站程序/百度百科官网首页

Unable to resolve target android-7 Unable to resolve target android-7 解决方案&#xff1a; 修改工程目录下的default.properties文件里的内容targetandroid-7改成targetandroid-8(或者其他版本)就可以了&#xff0c;最好用txt打开&#xff0c;然后修改之后保存&#xff0…...