浅析 Queue 和 Deque

news2024/11/19 7:44:27

终于开始了 LeetCode 的练习,看到 102. 二叉树的层序遍历 有种解法利用到了队列,想着挨个看看基础队列中的方法,便有了这篇文章。

基于 Java 对 Queue 以及 Deque(double ended queue) 实现进行学习介绍,JDK 版本:1.8.0_361。
在这里插入图片描述

全局概览

在这里插入图片描述
先看下 Queue 的注释:

  1. A collection designed for holding elements prior to processing. Besides basic Collection operations, queues provide additional insertion, extraction, and inspection operations:一个为了处理之前保存元素而设计的集合。除了 Collection 提供的基础操作外,还提供了额外的插入、提取、检查的操作。
  2. Queues typically, but do not necessarily, order elements in a FIFO (first-in-first-out) manner. Among the exceptions are priority queues, which order elements according to a supplied comparator, or the elements’ natural ordering, and LIFO queues (or stacks) which order the elements LIFO (last-in-first-out). :Queue(队列)一般以 FIFO(先进先出)的方式对元素进行排序(但是不一定按照:优先队列「根据提供的 comparator 或者元素自然排序」以及 LIFO(后入先出) 队列)。

再看下 Deque 的注释:
A linear collection that supports element insertion and removal at both ends:一个支持两端都支持元素插入删除的线性集合。

扩展下,当需要 LIFO 队列时不推荐使用 Stack,Stack 基于 Vector 实现,原因有以下两个:

  1. Vector 中的方法都有 synchronize 修饰,有性能问题(个人感觉不是重点,并发问题可以考虑:ConcurrentLinkedDeque)
  2. Vector 底层是数组,Stack 基于其实现,可以使用共有方法,对 LIFO 的特征造成破坏(感觉这个是重点)

基本方法

Queue

插入队尾:

  1. boolean add(E e):插入成功返回 true,失败抛异常
  2. boolean offer(E e):插入成功返回 true,失败返回 false

查询队首元素:

  1. E element():队列为空,抛异常
  2. E peek():队列为空,返回 null

删除队首元素:

  1. E remove():队列为空,抛异常
  2. E poll():队列为空,返回 null

Deque

插入队首

  1. void addFirst(E e):入队失败报异常
  2. boolean offerFirst(E e):入队失败返回 false

插入队尾

  1. void addLast(E e):入队失败报异常
  2. boolean offerLast(E e):入队失败返回 false

删除队首

  1. E removeFirst():队列为空抛异常
  2. E pollFirst():队列为空返回 null

删除队尾

  1. E removeLast():队列为空抛异常
  2. E pollLast():队列为空返回 null

查询队首元素

  1. E getFirst():队列为空抛异常
  2. E peekFirst():队列为空返回 null

查询队尾元素

  1. E getLast():队列为空抛异常
  2. E peekLast():队列为空返回 null

推荐阅读

下述各种队列具体实现原理博客等空了分专题学习整理分享,敬请期待。

涉及到了堆、锁、Delayed 接口。

深入理解Java PriorityQueue(和堆有关)

Java 阻塞队列(和锁有关)

Java 阻塞延迟队列 DelayQueue 原理及使用(和 Delayed 接口也有关)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue之代码传送(teleport)

代码传送是啥 在Vue中,代码传送就是将某部分的代码从Vue的template标签下传送到指定的地方,这个地方通常是body标签下。在使用Vue编写界面时,我们都是在html的Body中写一个div,然后指定一个id,然后在Vue的实例中的tem…

2023春招offer收割机,阿里架构师耗时半月写的《Java面试手册》

程序猿在世人眼里已经成为高薪、为人忠诚的代名词。 然而,小编要说的是,不是所有的程序员工资都是一样的。 世人所不知的是同为程序猿,薪资的差别还是很大的。 众所周知,目前互联网行业是众多行业中薪资待遇最好的,包…

Java语法理论和面经杂疑篇《九. 网络编程》

目录 1. 网络编程概述 1.1 软件架构 1.2 网络基础 2. 网络通信要素 2.1 如何实现网络中的主机互相通信 2.2 通信要素一:IP地址和域名 2.2.1 IP地址 2.2.2 域名 2.3 通信要素二:端口号 2.4 通信要素三:网络通信协议 2. 谈传输层协议…

时间序列教程 四、自回归和移动平均模型

一、本节目标 了解自相关函数(ACF)。 了解部分自相关函数(PACF)。 了解自回归和移动平均模型是如何工作的。 使用Python来拟合自相关模型。 二、ACF和PACF 1、自相关函数(ACF) 测量信号与自身延迟数据的相关性。 它用于发现信号中的重复模式,例如周期性信号的存…

Spring相关概念

Spring家族 官网:Spring | Home,从官网我们可以大概了解到: Spring能做什么:用以开发web、微服务以及分布式系统等,光这三块就已经占了JavaEE开发 的九成多。Spring并不是单一的一个技术,而是一个大家族,可以从官网的…

.NET基础加强第七课--文件流

序列化 JSON序列化 例子 using Nancy.Json; Person p1 new Person(); p1.Name “zs”; // json 序列化 JavaScriptSerializer javaScriptSerializer new JavaScriptSerializer(); string json javaScriptSerializer.Serialize(p1); Console.WriteLine(json); Console.…

linux-创建子进程的过程与原理(fork讲解)

我们知道,子进程可以被命令行创建,被fork函数创建,但是子进程创建了什么呢,是完全拷贝父进程函数?还是继承父进程数据呢? 首先我们要知道,进程的构成:进程内核数据结构可运行程序载…

二维差分【算法推导,图文讲解清晰】

798. 差分矩阵 - AcWing题库 算法推导 二维差分相对一维差分会复杂一点,而且还要结合二维前缀和的一些细节处理 A、B数组角色问题 在差分思想中,构造并不是那么重要,而是其中A、B数组的角色。 我们假想存在一个数组B,输入的A…

论文阅读《NeRF-Supervised Deep Stereo》

论文地址:https://arxiv.org/pdf/2303.17603.pdf 源码地址:https://nerfstereo.github.io/ 概述 针对深度估计的标签数据难以获取,自监督方法在病态(遮挡、非朗伯面)区域的表现差,跨域泛化能力弱的问题&…

【jvm系列-06】深入理解对象的实例化、内存布局和访问定位

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

Vue——组件基础

目录 定义一个组件​ 使用组件​ 传递 props​ 监听事件​ 通过插槽来分配内容​ 动态组件​ DOM 模板解析注意事项​ 大小写区分​ 闭合标签​ 元素位置限制​ 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应…

Learning to summarize from human feedback导读(1)

总结: (1)生成摘要等模型,虽然有评估方法,但是人类总结的质量依旧难以相比 总结: (1)在各种NLP任务中,大规模语言模型的预训练以及取得了很高的性能 (2&am…

PHP快速入门09-正则相关,附一定要学会的20个高频使用案例

文章目录前言一、正则表达式介绍二、正则高频案例20个2.1 检查字符串是否以字母开头2.2 检查字符串是否以数字开头2.3 检查字符串是否包含特定字符2.4 检查字符串是否以特定字符结尾2.5 检查字符串是否为纯数字2.6 检查字符串是否为纯字母2.7 检查字符串是否为有效的电子邮件地…

Bean对象的作用域和生命周期

文章目录:一.Bean的作用域 (1)Bean作用域的含义 (2)Bean的6种作用域 二.Bean的生命周期(1)开辟内存空间 (2) 属性注入 (3)初始化 (4)使用Bean (…

【CSDN|每日一练】运输石油

目录 运行结果题目描述输入描述:输出描述:示例代码结语运行结果 题目描述 某石油公司需要向A、B两地运输石油。 两地的需求量不同,而一辆车只能装载一定量的石油。 经过计算A地需要a辆车,B地需要b辆车运输才能满足需求。 现在一共有n辆车分布在各地,每辆车前往A、B两地…

HFSS一些使用技巧总结

1. 快捷键: CTRLH,隐藏选择的object、face 字母E,选择edge(线) alt左键双击九个区域,切换9个不同的视角(与789组合使用) 2. 复制: 这样的复制好处在于:复制完的物体相…

使用Excel打造一款个人日志系统

写在前面 我很多年前看过晨间日志的奇迹这一本书,我深受启发,这本书的中心思想就是通过九宫格的方式写连体日志,自己可以方便查找而有而且有激情去完成这个日志,书中推荐的方法是使用excel写日志。但是自己总感觉用excel过于麻烦…

Java 源码中的 <? extends U>与 <? super L>是什么?

目录 ? extends U ? super L 总结一下: ? extends U 其中extends意思为:扩大;扩展;延长,?我们可以把他看作一个通配符,匹配所有的接口,U就一个泛型占位符,所以连在一起可联想到,从U…

前后端分离下的-SpringSecurity

前后端分离下的SpringSecurity 项目创建 使用SpringBoot初始化器创建SpringBoot项目 修改项目依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2…

电容笔和Apple pencil的区别是什么?好用电容笔推荐

Apple Pencil与目前市场上常见的电容笔最大的不同之处在于&#xff0c;普通电容笔并不具备苹果Pencil特有的重力压感&#xff0c;而仅仅是一种倾斜的压感。不过&#xff0c;其在其它方面的表现也很出色&#xff0c;与Apple Pencil相似&#xff0c;而且价格仅为200元。现在&…