列队 Queue 接口概述

在Java中,Queue(队列)是一种基本的数据结构,用于按照先进先出(FIFO)的顺序存储元素。Java提供了多种实现Queue接口的类,以下是几种常见的实现方式:

  1. LinkedList:LinkedList实现了Queue接口,并且支持队列的所有操作,包括添加元素到队尾、获取队头元素、删除队头元素等。
Queue<String> queue = new LinkedList<>();
queue.add("element1"); // 添加元素到队尾
String element = queue.peek(); // 获取队头元素
String removedElement = queue.remove(); // 删除队头元素 

2. ArrayDeque:ArrayDeque也实现了Queue接口,并且支持队列的操作。它使用可调整大小的数组来存储元素,可以在队列的两端进行高效地插入和删除操作。

Queue<String> queue = new ArrayDeque<>();
queue.offer("element1"); // 添加元素到队尾
String element = queue.peek(); // 获取队头元素
String removedElement = queue.poll(); // 删除队头元素 

3. PriorityQueue:PriorityQueue是一种基于优先级的队列,它允许你根据元素的自然顺序或自定义的Comparator来确定元素的优先级。

Queue<Integer> queue = new PriorityQueue<>();
queue.offer(3); // 添加元素到队列并根据优先级排序
queue.offer(1);
queue.offer(2);
int element = queue.peek(); // 获取优先级最高的元素
int removedElement = queue.poll(); // 删除并返回优先级最高的元素 

通过使用上述的Queue实现类,你可以根据具体的需求选择适合的队列实现,并进行相应的操作。

继承Queue的接口

Queue接口还可以被各种子接口继承:

  • Deque

  • BlockingQueue

  • BlockingDeque

Deque,BlockingQueue和BlockingDeque扩展了Queue接口。

队列数据结构的工作流程

在队列中,以先进先出的方式存储和访问元素。也就是说,从后面添加元素,从前面删除元素

队列数据结构的工作:先进先出。

如何使用队列(Queue)?

在Java中,必须导入java.util.Queue包才能使用Queue。

// 使用 LinkedList 创建
Queue<String> animal1 = new LinkedList<>();// 使用 ArrayDeque 创建
Queue<String> animal2 = new ArrayDeque<>();// 使用 PriorityQueue创建
Queue<String> animal 3 = new PriorityQueue<>();

在这里,我们分别创建了类LinkedList,ArrayDeque和PriorityQueue的对象Animal1,Animal2和Animal3。 这些对象可以使用Queue接口的功能。

Queue的方法

Queue接口包括Collection接口的所有方法。 这是因为Collection是Queue的超级接口。

Queue接口的一些常用方法是:

  • add() - 将指定的元素插入队列。如果任务成功,则add()返回true,否则将引发异常。

  • offer() - 将指定的元素插入队列。如果任务成功,则offer()返回true,否则返回false。

  • element() - 返回队列的开头。如果队列为空,则引发异常。

  • peek() - 返回队列的开头。 如果队列为空,则返回null。

  • remove() - 返回并删除队列的头部。如果队列为空,则引发异常。

  • poll() - 返回并删除队列的开头。 如果队列为空,则返回null。

队列接口的实现

1.添加元素: 为了在队列中添加一个元素,我们可以使用add()方法。在PriorityQueue中不保留插入顺序。元素是根据优先级顺序存储的,默认是升序的。

例子

// Java program to add elements
// to a Queueimport java.util.*;public class GFG {public static void main(String args[]){Queue<String> pq = new PriorityQueue<>();pq.add("Geeks");pq.add("For");pq.add("Geeks");System.out.println(pq);}
}

输出

[For, Geeks, Geeks]

2.删除元素: 为了从队列中删除一个元素,我们可以使用remove()方法。如果有多个这样的对象,那么第一个出现的对象将被删除。除此之外,poll()方法也被用来删除头部并返回。

例子

// Java program to remove elements
// from a Queueimport java.util.*;public class GFG {public static void main(String args[]){Queue<String> pq = new PriorityQueue<>();pq.add("Geeks");pq.add("For");pq.add("Geeks");System.out.println("Initial Queue " + pq);pq.remove("Geeks");System.out.println("After Remove " + pq);System.out.println("Poll Method " + pq.poll());System.out.println("Final Queue " + pq);}
}

输出

Initial Queue [For, Geeks, Geeks]
After Remove [For, Geeks]
Poll Method For
Final Queue [Geeks]

3.遍历队列: 有多种方法来遍历队列。最著名的方法是将队列转换为数组并使用for循环进行遍历。然而,队列也有一个内置的迭代器,可以用来遍历队列。

例子

// Java program to iterate elements
// to a Queueimport java.util.*;public class GFG {public static void main(String args[]){Queue<String> pq = new PriorityQueue<>();pq.add("Geeks");pq.add("For");pq.add("Geeks");Iterator iterator = pq.iterator();while (iterator.hasNext()) {System.out.print(iterator.next() + " ");}}
}

输出

For Geeks Geeks

队列的特点: 以下是队列的特点。

  • 队列用于在队列的末端插入元素,并从队列的开头删除。它遵循FIFO概念。
  • Java队列支持集合接口的所有方法,包括插入、删除等。
  • LinkedList、ArrayBlockingQueue和PriorityQueue是最常使用的实现方式。
  • 如果对阻塞队列进行任何空操作,就会抛出NullPointerException。
  • java.util包中的队列是无界队列。
  • java.util.concurrent包中的队列是有界队列。
  • 除了Deques之外,所有的队列都分别支持在队列的尾部和头部进行插入和删除。Deques支持两端的元素插入和删除。

实现队列接口的类

1.PriorityQueue: 在集合框架中实现的PriorityQueue类为我们提供了一种根据优先级来处理对象的方法。众所周知,队列遵循先入先出的算法,但有时需要根据优先级来处理队列中的元素,这时PriorityQueue就发挥作用了。让我们看看如何使用这个类来创建一个队列对象。

例子

import java.util.*;class Zeus {public static void main(String args[]){// Creating empty priority queueQueue<Integer> pQueue= new PriorityQueue<Integer>();// Adding items to the pQueue// using add()pQueue.add(10);pQueue.add(20);pQueue.add(15);// Printing the top element of// the PriorityQueueSystem.out.println(pQueue.peek());// Printing the top element and removing it// from the PriorityQueue containerSystem.out.println(pQueue.poll());// Printing the top element againSystem.out.println(pQueue.peek());}
}

输出

10
10
15

2. LinkedList: LinkedList是一个在集合框架中实现的类,它内在地实现了链接列表数据结构。它是一个线性数据结构,其中的元素不存储在连续的位置,每个元素都是一个独立的对象,有数据部分和地址部分。这些元素使用指针和地址进行链接。每个元素被称为一个节点。由于其动态性和易于插入和删除的特点,它们比数组或队列更受欢迎。让我们看看如何使用这个类来创建一个队列对象。

例子

import java.util.*;class Zeus {public static void main(String args[]){// Creating empty LinkedListQueue<Integer> ll= new LinkedList<Integer>();// Adding items to the ll// using add()ll.add(10);ll.add(20);ll.add(15);// Printing the top element of// the LinkedListSystem.out.println(ll.peek());// Printing the top element and removing it// from the LinkedList containerSystem.out.println(ll.poll());// Printing the top element againSystem.out.println(ll.peek());}
}

输出

10
10
20

3. PriorityBlockingQueue: 需要注意的是,PriorityQueue和LinkedList的实现都不是线程安全的。如果需要线程安全的实现,PriorityBlockingQueue是一个替代性的实现。PriorityBlockingQueue是一个无界的阻塞队列,它使用与PriorityQueue类相同的排序规则,并提供阻塞的检索操作。
因为它是无界的,添加元素有时会因为资源耗尽而失败,导致OutOfMemoryError。让我们看看如何使用这个类来创建一个队列对象。

例子

import java.util.concurrent.PriorityBlockingQueue;
import java.util.*;class Zeus {public static void main(String args[]){// Creating empty priority// blocking queueQueue<Integer> pbq= new PriorityBlockingQueue<Integer>();// Adding items to the pbq// using add()pbq.add(10);pbq.add(20);pbq.add(15);// Printing the top element of// the PriorityBlockingQueueSystem.out.println(pbq.peek());// Printing the top element and// removing it from the// PriorityBlockingQueueSystem.out.println(pbq.poll());// Printing the top element againSystem.out.println(pbq.peek());}
}

输出

10
10
15

队列接口的方法

队列接口继承了集合接口中的所有方法,同时实现了以下方法。

方法描述
add(int index, element)这个方法用来在队列中的某个特定索引处添加一个元素。当一个参数被传递时,它只是在队列的末端添加元素。
addAll(int index, Collection collection)这个方法用来添加给定集合中的所有元素到队列中。当传递一个参数时,它在队列的末尾添加给定集合的所有元素。
size()该方法用于返回队列的大小。
clear()这个方法用来删除队列中的所有元素。然而,创建的队列的引用仍然被保存。
remove()这个方法用来从队列的前面删除元素。
remove(int index)这个方法从指定的索引中删除一个元素。它将随后的元素(如果有的话)向左移动并将它们的索引减少1。
remove(element)该方法用于删除并返回队列中第一次出现的给定元素。
get(int index)该方法返回指定索引的元素。
set(int index, element)这个方法用新的元素替换给定索引上的元素。这个函数返回刚刚被新元素替换的元素。
indexOf(element)该方法返回给定元素的第一次出现,如果该元素在队列中不存在,则返回 -1
lastIndexOf(element)该方法返回给定元素的最后一次出现,如果该元素在队列中不存在,则返回 -1
equals(element)该方法用于比较给定元素与队列中的元素是否相等。
hashCode()该方法用于返回给定队列的哈希代码值。
isEmpty()该方法用于检查队列是否为空。如果队列是空的,它返回 true,否则返回 false。
contains(element)该方法用于检查队列是否包含给定的元素。如果队列包含该元素,它返回真。
containsAll(Collection)该方法用于检查队列是否包含所有的元素集合。
sort(Comparator comp)该方法用于在给定的比较器的基础上对队列中的元素进行排序。
boolean add(object)该方法用于将指定的元素插入队列中,成功后返回true。
boolean offer(object)该方法用于将指定的元素插入队列中。
Object poll()该方法用于检索和删除队列的头部,如果队列是空的,则返回null。
Object element()这个方法用于检索,但不删除队列的头部。
Object peek()这个方法用来检索,但不删除这个队列的头部,如果这个队列是空的,则返回null。

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

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

相关文章

RISC-V公测平台发布 · 使用YCSB测试SG2042上的MySQL性能

实验介绍&#xff1a; YCSB&#xff08;全称为Yahoo! Cloud Serving Benchmark&#xff09;&#xff0c;该性能测试工具由Java语言编写&#xff08;在之前的MC文章中也提到过这个&#xff0c;如果没看过的读者可以去看看之前MC那一期&#xff09;&#xff0c;主要用于云端或者…

【位操作符的几种题型】

位操作符的几种题型 目录 题型一&#xff1a;寻找“单身狗”。 题型二&#xff1a;计算一个数在二进制中1的个数 题型三&#xff1a;不允许创建临时变量&#xff0c;交换两个整数的内容 题型一&#xff1a;寻找“单身狗”。 1.1题目解析 在一个整型数组中&#xff0c;只有…

SUB-1G SOC芯片DP4306F 32 位 ARM Cortex-M0+内核替代CMT2380F32

DP4306F是一款高性能低功耗的单片集成收发机&#xff0c;集成MO核MCU&#xff0c;工作频率可覆盖200MHiz^ 1000MHz。 支持230/408/433/470/868/915频段。该芯片集成了射频接收器、射频发射器、频率综合器、GFSK调制器、GFSK解调器等功能模块。通过SPI接口可以对输出功率、频道选…

element-plus的日期选择器限定选择范围

目录 前言一、最近30天总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; element-plus的日期选择器限定选择范围&#xff0c;由于数据的获取范围限定&#xff0c;需要前端处理一下日期的选择范围 提示&#xff1a;以下是本篇文章正文内容&#xff0c…

软考高级之系统架构师之数据通信与计算机网络

概念 OSPF 在划分区域之后&#xff0c;OSPF网络中的非主干区域中的路由器对于到外部网络的路由&#xff0c;一定要通过ABR(区域边界路由器)来转发&#xff0c;既然如此&#xff0c;对于区域内的路由器来说&#xff0c;就没有必要知道通往外部网络的详细路由&#xff0c;只要由…

【计算机网络】概述及数据链路层

每一层只依赖于下一层所提供的服务&#xff0c;使得各层之间相互独立、灵活性好&#xff0c;已于实现和维护&#xff0c;并能促进标准化工作。 应用层&#xff1a;通过应用进程间的交互完成特定的网络应用&#xff0c;HTTP、FTP、DNS&#xff0c;应用层交互的数据单元被称为报…

音频光耦合器

音频光耦合器是一种能够将电信号转换为光信号并进行传输的设备。它通常由发光二极管&#xff08;LED&#xff09;和光敏电阻&#xff08;光电二极管或光敏电阻器&#xff09;组成。 在音频光耦合器中&#xff0c;音频信号经过放大和调节后&#xff0c;被转换为电流信号&#xf…

【密码学】六、公钥密码

公钥密码 1、概述1.1设计要求1.2单向函数和单向陷门函数 2、RSA公钥密码体制2.1加解密2.2安全性分析 3、ElGamal公钥密码体制3.1加解密算法3.2安全性分析 4、椭圆曲线4.1椭圆曲线上的运算4.2ECC 5、SM2公钥密码体制5.1参数选取5.2密钥派生函数5.3加解密过程5.3.1初始化5.3.2加密…

ThinkPHP6企业OA办公系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6企业OA办公系统 一 介绍 勾股OA基于ThinkPHP6开发&#xff0c;前端Layui&#xff0c;数据库mysql&#xff0c;是一款实用的企业办公系统。可多角色登录&#xff0c;集成了系统设置、人事管理、消息管理、审批管理、日常办公、客户…

pytest 用例运行方式

一、命令行方式运行 执行某个目录下所有的用例&#xff0c;符合规范的所有用例 进入到对应的目录,直接执行pytest; 例如需要执行testcases 下的所有用例; 可以进入testcases 目录; 然后执行pytest 进入对应目录的上级目录,执行pytest 目录名称/ ; ; 例如需要执行testcases 下…

【Android】在Windows11系统上运行VisualStudioEmulator forAndroid

这是一个x86架构处理器的安卓模拟器&#xff0c; 在Visual Studio开发工具上用的&#xff0c;也是运行在Hyper-V虚拟机上的&#xff0c;相比其它的模拟器的性能好&#xff0c;占用磁盘空间小&#xff0c;操作简洁方便&#xff0c;非常适合开发人员调试安卓手机模拟。 安装 首…

K8S系列文章之 Traefik快速入门

traefik 与 nginx 一样&#xff0c;是一款优秀的反向代理工具&#xff0c;或者叫 Edge Router。至于使用它的原因则基于以下几点 无须重启即可更新配置自动的服务发现与负载均衡与 docker 的完美集成&#xff0c;基于 container label 的配置漂亮的 dashboard 界面metrics 的支…

要实现智能制造到底有多难?先看看这一步...

是新朋友吗&#xff1f;记得先点上方蓝字关注Ruff 智能制造、数字化转型&#xff0c;已成为当下制造业最炙手可热的话题&#xff0c;政府工作报告中已多次提到&#xff0c;为了促进数字经济发展&#xff0c;加强数字中国建设整体布局&#xff0c;打造智能工厂、智慧工厂。愿景是…

论文阅读---《Unsupervised Transformer-Based Anomaly Detection in ECG Signals》

题目&#xff1a;基于Transformer的无监督心电图&#xff08;ECG&#xff09;信号异常检测 摘要 异常检测是数据处理中的一个基本问题&#xff0c;它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易&#xff0c;然而&#xff…

SEO搜索引擎优化

目录 场景 内部业务To B (Business-to-Business&#xff0c;B2B)需要降低SEO&#xff0c;反爬 客户业务To C (Business-to-Consumer&#xff0c;B2C)需要提高SEO TDK优化 Title&#xff08;标题&#xff09; Description&#xff08;描述&#xff09; Keywords&#xff…

matplotlib 笔记 plt.grid

用于添加网格线 主要参数 visible 布尔值&#xff0c;True表示画网格 which表示要显示的刻度线类型&#xff0c;可以是 major&#xff08;主刻度&#xff09;或 minor&#xff08;次刻度&#xff09;&#xff0c;或者同时显示&#xff08;both&#xff09;alpha 透明度 …

Effective Java笔记(27)消除非受检的警告

用泛型编程时会遇到讲多编译器警告 &#xff1a; 非受检转换警告&#xff08; unchecked cast warning &#xff09;、非受检方法调用警告、非受检参数化可变参数类型警告&#xff08; unchecked parameterized vararg type warning&#xff09;&#xff0c;以及非受检转换警告…

【Pyhthon实战】Python对全校电费查询采集并可视化分析

前言 今天,我来说说怎么抓取宿舍电费的过程。我们学校是在完美校园交电费的,我们可以不用取抓包完美校园的数据接口,我们可以直接登录学校的一卡通网站,每个学校都有,大家可以自己找找,这里我为什么要抓包呢,因为学校提供的网站已经打不开了,这里就不介绍怎么抓包了。 …

9篇论文速览 ICML 2023 测试时自适应(TTA)最新研究进展

测试时自适应对于领域转移下真实机器感知应用的成功至关重要&#xff0c;近年来&#xff0c;研究者们仍然在不断优化现有的方法。在今年的ICML中&#xff0c;TTA相关的研究也有了最新进展。 1.Uncovering Adversarial Risks of Test-Time Adaptation 标题&#xff1a;揭示测试…

Java 常用编辑器 IntelliJ IDEA

文章目录 IDEA 概述IDEA 下载和安装IDEA 中的第一个代码IDEA 的项目和模块操作&#xff08;一&#xff09;类的操作&#xff08;二&#xff09;模块的操作&#xff08;三&#xff09;项目的操作 IDEA 概述 IntelliJ IDEA是一款由JetBrains开发的集成开发环境&#xff08;IDE&am…