JAVA 中栈,为什么要使用Deque,而不推荐使用Stack

双端队列(Deque)

一、概念

1. 概念
    双端队列(Deque)是Quene是一个子接口,双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队(push)和出队(pop),则可限制栈的数据结构。对于栈而言,有入栈,遵循先进后出原则。

2. 双端队列的使用
   (在实际使用中,Deque接口使用的是比较多的,栈和队列都可以使用该接口,这个接口中有栈的方法,也有队列的方法)

Quene以及Deque都是继承于Collection,Deque是Quene的子接口。

 Quene是先进先出的单向队列,Deque是双向队列。

public interface Deque<E> extends Queue<E> 

二、Quene接口
1、Quene是集合框架Collection的子接口,是一种常见的数据结构,Quene有一个直接子类PriorityQuene,队列Quene是一种常用的数据结构,可以将队列看作是一种特殊的线性表,该结构遵循的先进先出原则。Java中,LinkedList实现了Quene接口,因为LinkedList进行插入、删除操作效率较高。

poll():将队首的元素删除,并返回该元素。
peek():返回队首的元素,但不进行删除操作。
offer():将元素添加到队尾,如果成功,则返回true。

2、 Quene的具体代码操作


import java.util.*;public class QueneDemo {public static void testQuene(){Queue<String> qu = new LinkedList<>();qu.add("小米");qu.add("华为");System.out.println("原始队列:");System.out.println(qu);System.out.println("通过add往队尾添加元素:");qu.add("OPPO"); //add()方法System.out.println(qu);System.out.println("通过offer往队列尾添加元素:");qu.offer("vivo"); //offer()方法System.out.println(qu);System.out.println("使用remove删除队列头元素:");qu.remove(); //remove()方法System.out.println(qu);System.out.println("使用poll删除对列头元素:");qu.poll(); //poll()方法System.out.println(qu);}public static void main(String[] args){QueneDemo.testQuene();}
}

执行结果如下:
原始队列:
[小米, 华为]
通过add往队尾添加元素:
[小米 , 华为, OPPO]
通过offer往队列尾添加元素:
[小米, 华为, OPPO, vivo]
使用remove删除队列头元素:
[小米, OPPO, vivo]
使用poll删除对列头元素:
[OPPO, vivo]

三、Deque接口(双向队列)
1、双端队列(Deque),是Quene是一个子接口,双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队(push)和出队(pop),则可限制栈的数据结构。对于栈而言,有入栈,遵循先进后出原则。
  它既可以当作栈使用,也可以当作队列使用

add()\offer(e):将元素增加到队列的末尾,如果成功,返回true。
remove()\poll():将元素从队列的队首删除。
element()\peek():返回队首的元素,但不进行删除
栈:
push(e):入栈,添加到队首
pop(e):出栈,删除队首元素
peek():返回栈首元素,但不进行删除

ArrayDeque, LinkedList , Stack的关系差不多就是下图那样

 Stack实现了Vector接口,LinkKist实现了Deque,List接口,ArrayDeque实现了Deque接口

为什么不推荐使用Stack?
因为Vector是当初JAVA曾经写得不太行的类,所以Stack也不太行。

Vector不行是因为效率不太行,很多方法都用了synchronized修饰,虽然线程安全,但是像ArrayDeque,LinkedList这些线程不安全的,在需要安全的时候也可以用Collections.synchronizedCollection()转化成线程安全的,所以Vector就没什么用处了
Stack只能上进上出,
Deque上进上出,上进下出,甚至下进上出,非常上流,只有你想不到,没有我Deque做不到的。

ArrayDeque与LinkList区别:
ArrayDeque:
  • 数组结构
  • 插入元素不能为null
  • 无法确定数据量时,后期扩容会影响效率
LinkList:
  • 链表结构
  • 插入元素能为null
  • 无法确定数据量时,有更好表现

Deque中常用方法:

以这2个为基础整出来的Deque除了结构不一样,方法都一样的。

把Deque当栈用的时候:

 把Deque当队列用的时候:

 有些时候需要进行一些骚操作的时候(比如取得栈底元素,取得队尾元素),这些常规操作就不能满足了。

  • 下面就是Deque中一些更详细的方法。

从上面(头部)插入:

从上面(头部)出来/观察:

从下面(尾部)插入:

从下面(尾部)出来/观察:

 

相关参考链接:              
[1]原文链接:https://blog.csdn.net/weixin_42488513/article/details/120233456           
[2]原文链接:https://blog.csdn.net/qq_44013629/article/details/106461200

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack配置

一、很多基础方面的配置被vuecli所集成一般项目都是使用vuecli,不会真正的去从0-1进行webpack配置: 1、vuecli中的webpack基础配置: (1)入口文件默认在src/main;输出在dist; (2)集成了大量的插件和加载器:babel-loader 处理 JavaScript 文件、使用 css-loader 和 style-load…

Android Studio从零基础到APP上线(3)

第3章 简单控件 本章介绍App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图,容纳视图的常用布局,响应点击的按钮控件,显示图片的图像视图等。然后结合本章所学的知识,演示一个实战项目“简单计算器”的设计与实现。 3.1 文本显示 本节介绍如何在文本视图Tex…

Linux下编译EtherCAT主站SOEM-1.4.1

目录 1、SOEM下载 2、CMake安装​​​​​​ 3、编译 环境&#xff1a;Ubuntu1604. 1、SOEM下载 最新版为SOEM-v1.4.0&#xff0c;可以从github下载地址&#xff1a; https://github.com/OpenEtherCATsociety/SOEM 2、CMake安装​​​​​​ 3、编译 解压文件&#xff0c…

系统添加多版本支持

记录一下最近做的一个需求&#xff1a; 前段时间做的【监狱点名系统】改成公司打卡考勤用的系统&#xff0c;里面的"服刑人员"、"监区"、"入监/出监"……等相关配置需要做改动&#xff0c;所以考虑加一个全局的标志&#xff0c;来区分一下版本。…

Apache POI与easyExcel:Excel文件导入导出的技术深度分析

在处理Excel文件时&#xff0c;Java开发者经常会面临多种选择&#xff0c;其中Apache POI和easyExcel是两个非常受欢迎的选择。这两个库都提供了强大的Excel文件处理功能&#xff0c;但在性能、内存使用、API设计以及扩展性方面有所不同。本文将深入分析Apache POI和easyExcel在…

算法学习——华为机考题库4(HJ26 - HJ30)

算法学习——华为机考题库4&#xff08;HJ26 - HJ30&#xff09; HJ26 字符串排序 描述 编写一个程序&#xff0c;将输入字符串中的字符按如下规则排序。 规则 1 &#xff1a;英文字母从 A 到 Z 排列&#xff0c;不区分大小写。 如&#xff0c;输入&#xff1a; Type 输出…

C#之linq和lamda表达式GroupBy分组拼接字符串

文章目录 C#之linq和lamda表达式GroupBy分组拼接字符串业务需求核心代码调试 C#之linq和lamda表达式GroupBy分组拼接字符串 业务需求 点击提示信息&#xff0c;如&#xff1a;“售后单【SH001】序列号【001&#xff0c;002&#xff0c;006】&#xff1b;售后单【SH002】序列号…

2024美赛数学建模A题思路分析 - 资源可用性和性别比例(2)

# 1 赛题 问题A&#xff1a;资源可用性和性别比例 虽然一些动物物种存在于通常的雄性或雌性性别之外&#xff0c;但大多数物种实质上是雄性或雌性。虽然许多物种在出生时的性别比例为1&#xff1a;1&#xff0c;但其他物种的性别比例并不均匀。这被称为适应性性别比例的变化。…

【学习笔记】详解换根法(换根DP)

一.换根DP的概念 1.换根DP是什么&#xff1f; 换根DP&#xff0c;又叫二次扫描&#xff0c;是树形DP的一种。 2.换根DP能解决什么问题&#xff1f; 换根DP能解决不指定根结点&#xff0c;并且根节点的变化会对一些值产生影响的问题。例如子结点深度和、点权和等。如果要 暴力…

uptime-kuma拨测

uptime-kuma拨测 https://github.com/louislam/uptime-kumadocker run -d --restartalways -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1[rootvm ~]# git clone https://github.com/louislam/uptime-kuma.git

智慧商城项目(ing)

项目概述 1.创建项目 目标&#xff1a;基于VueCli自定义创建项目架子&#xff0c;将目录调整成符合企业规范的目录 删除多余的文件 修改路由配置 和App.vue 新增两个目录 api/utils ①api接口模块:发送ajax请求的接口模块 ②utils工具模块:自己封装的一些工具方法模块 2…

双非本科准备秋招(15.3)—— 力扣二叉树

今天学了二叉树结点表示法&#xff0c;建树代码如下。 public class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val) {this.val val;}public TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left …