Java 队列 – Java 中的队列

2023-11-08

Java Queue is an interface available in java.util package and extends java.util.Collection interface. Just like Java List, Java Queue is a collection of ordered elements (Or objects) but it performs insert and remove operations differently. We can use Queue to store elements before processing those elements.

Java队列

在本节中,我们将讨论有关 Java 队列的一些要点:

  • java.util.Queue 接口是 java.util.Collection 接口的子类型。
  • 就像现实世界中的队列(例如,在银行或 ATM 中)一样,Queue 在队列末尾插入元素并从队列开头删除元素。
  • Java 队列表示元素的有序列表。
  • Java 队列遵循 FIFO 顺序插入和删除元素。 FIFO 代表先进先出。
  • Java Queue 支持 Collection 接口的所有方法。
  • 最常用的队列实现是 LinkedList、ArrayBlockingQueue 和 PriorityQueue。
  • BlockingQueue 不接受 null 元素。如果我们执行任何与 null 相关的操作,它会抛出 NullPointerException。
  • BlockingQueues 用于实现基于生产者/消费者的应用程序。
  • BlockingQueue 是线程安全的。
  • java.util 包中可用的所有队列都是无界队列,而 java.util.concurrent 包中可用的队列是有界队列。
  • 所有双端队列都不是线程安全的。
  • ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列。
  • 除双端队列外,所有队列都支持在队列尾部插入和在队列头部删除。
  • 双端队列是队列,但它们支持在两端插入和删除元素。

Java队列类图

Java Queue interface extends Collection interface. Collection interface extends Iterable interface. Some of the frequently used Queue implementation classes are LinkedList, PriorityQueue, ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue etc… AbstractQueue provides a skeletal implementation of the Queue interface to reduce the effort in implementing Queue.

Java 队列方法

在本节中,我们将讨论一些有用且常用的 Java 队列方法:

  1. int size():获取Set中元素的数量。
  2. boolean isEmpty():检查 Set 是否为空。
  3. boolean contains(Object o):如果此 Set 包含指定元素,则返回 true。
  4. Iterator iterator():返回此集合中元素的迭代器。返回的元素没有特定的顺序。
  5. boolean removeAll(Collection c):从此集合中删除指定集合中包含的所有元素(可选操作)。
  6. boolean keepAll(Collection c):仅保留此集合中包含在指定集合中的元素(可选操作)。
  7. voidclear():从集合中删除所有元素。
  8. Eremove():检索并删除该队列的头部。
  9. E poll():检索并移除该队列的头部,如果该队列为空则返回null。
  10. E peek():检索但不删除此队列的头部,如果此队列为空,则返回 null。
  11. boolean Offer(E e):如果可以立即插入指定元素而不违反容量限制,则将指定元素插入此队列。
  12. E element():检索但不删除该队列的头。
  13. boolean add(E e):如果可以立即插入指定元素而不违反容量限制,则将指定元素插入此队列,成功时返回 true,如果当前没有可用空间,则抛出 IllegalStateException。
  14. Object[] toArray():返回一个包含该集合中所有元素的数组。如果此集合对其迭代器返回其元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。

Java 队列基础知识

由于Java Queue扩展了Java Collection,因此它也支持所有Collection接口操作。让我们在以下示例中探讨一些简单的操作:

package com.journaldev.queue;
import java.util.*;

public class QueueExample {
   public static void main(String[] args) {
		
	Queue<String> queue = new LinkedList<>();
	queue.add("one");
	queue.add("two");
	queue.add("three");
	queue.add("four");
	System.out.println(queue);
		
	queue.remove("three");
	System.out.println(queue);
	System.out.println("Queue Size: " + queue.size());
	System.out.println("Queue Contains element 'two' or not? : " + queue.contains("two"));

	// To empty the queue
	queue.clear();
   }
}

Output:-

[one, two, three, four]
[one, two, four]
Queue Size: 3
Queue Contains element 'two' or not? : true

Java 数组到队列

这里我们可以通过一个简单的例子来探索如何使用“Collections.addAll()”方法将 Java 数组转换为队列。

import java.util.*;

public class ArrayToQueue {
    public static void main(String[] args) {
		
	String nums[] = {"one","two","three","four","five"};
	Queue<String> queue = new LinkedList<>();
	Collections.addAll(queue, nums);
	System.out.println(queue);
   }
}

Output:-当我们运行上面的程序时,我们将得到以下输出:

[one, two, three, four, five]

Java队列到数组

这里我们将通过一个简单的例子来探讨如何使用“toArray()”将 Java 队列转换为 Java 数组。

import java.util.*;

public class QueueToArray {
   public static void main(String[] args) {
		
	Queue<String> queue = new LinkedList<>();
	queue.add("one");
	queue.add("two");
	queue.add("three");
	queue.add("four");
	queue.add("five");
		
	String strArray[] = queue.toArray(new String[queue.size()]);
	System.out.println(Arrays.toString(strArray)); 

   }
}

Output:-当我们运行上面的程序时,我们将得到以下输出:

[one, two, three, four, five]

Java队列常用操作

Java Queue 支持 Collection 接口支持的所有操作以及更多操作。它支持两种形式的几乎所有操作。

  • 如果操作失败,一组操作将引发异常。
  • 如果操作失败,另一组操作将返回一个特殊值。

下表简要解释了所有 Queue 常见操作。

Operation Throws exception Special value
Insert add(e) offer(e)
Remove remove() poll()
Examine element() peek()

我们将在接下来的章节中介绍每个操作并通过一些有用的示例详细讨论它们。

Java队列插入操作

在本节中,我们将通过一些有用的示例详细讨论 Java 队列插入操作。如果此操作执行成功,则返回“true”值。我们知道,Queue支持两种形式的插入操作:

  • 队列.add(e): 如果操作失败,它会抛出异常。- Queue.offer(e): 如果操作失败,它会返回一个特殊值。

NOTE:-这里的特殊值可以是“false”或“null”

队列add()操作

add() 操作用于向队列中插入新元素。如果成功执行插入操作,则返回“true”值。否则它会抛出 java.lang.IllegalStateException。让我们开发一个简单的示例来演示此功能。

import java.util.concurrent.*;

public class QueueAddOperation {
   public static void main(String[] args) {
		
	BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);

	System.out.println(queue.add("one"));
	System.out.println(queue.add("two"));
	System.out.println(queue);
	System.out.println(queue.add("three"));
	System.out.println(queue);
   }
}

Output:-当我们运行上面的程序时,我们将得到以下输出:

true
true
[one, two]
Exception in thread "main" java.lang.IllegalStateException: Queue full

由于我们的队列仅限于两个元素,因此当我们尝试使用 BlockingQueue.add() 添加第三个元素时,它会抛出异常,如上所示。

队列 Offer() 操作

Offer() 操作用于将新元素插入队列。如果成功执行插入操作,则返回“true”值。否则返回“假”值。让我们开发一个简单的示例来演示此功能。

import java.util.concurrent.*;

public class QueueOfferOperation {
   public static void main(String[] args) {
		
	BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);

	System.out.println(queue.offer("one"));
	System.out.println(queue.offer("two"));
	System.out.println(queue);
	System.out.println(queue.offer("three"));
	System.out.println(queue);
   }
}

Output:-当我们运行上面的程序时,我们将得到以下输出:

true
true
[one, two]
false
[one, two]

由于我们的队列仅限于两个元素,因此当我们尝试使用 BlockingQueue.offer() 操作添加第三个元素时,它会返回“false”值,如上所示。

Java队列删除操作

在本节中,我们将通过一些有用的示例详细讨论 Java 队列删除操作。如果执行成功,删除操作将返回队列的头元素。我们知道,Queue 支持两种形式的删除操作:

  • 队列.remove(): 如果操作失败,它会抛出异常。- Queue.poll(): 如果操作失败,它会返回一个特殊值。

NOTE:-这里的特殊值可以是“false”或“null”

队列remove()操作

remove() 操作用于从队列头部删除一个元素。如果删除操作成功,则返回队列的头元素。否则它会抛出 java.util.NoSuchElementException。让我们开发一个简单的示例来演示此功能。

import java.util.*;

public class QueueRemoveOperation 
{
   public static void main(String[] args) 
   {		
	Queue<String> queue = new LinkedList<>();
	queue.offer("one");
	queue.offer("two");		
	System.out.println(queue);		
	System.out.println(queue.remove());
	System.out.println(queue.remove());		
	System.out.println(queue.remove());		
   }
}

Output:-当我们运行上面的程序时,我们将得到以下输出:

[one, two]
one
two
Exception in thread "main" java.util.NoSuchElementException

由于我们的队列只有两个元素,当我们尝试第三次调用remove()方法时,它会抛出一个异常,如上所示。NOTE:-Queue.remove(element) 用于从队列中删除指定元素。如果成功执行删除操作,则返回“true”值。否则返回“假”值。

队列 poll() 操作

poll() 操作用于从队列头部删除一个元素。如果删除操作成功,则返回队列的头元素。否则返回“null”值。让我们开发一个简单的示例来演示此功能。

import java.util.*;

public class QueuePollOperation 
{
   public static void main(String[] args) 
   {		
	Queue<String> queue = new LinkedList<>();
	queue.offer("one");
	queue.offer("two");		
	System.out.println(queue);		
	System.out.println(queue.poll());
	System.out.println(queue.poll());		
	System.out.println(queue.poll());		
   }
}

Output:-当我们运行上面的程序时,我们将得到以下输出:

[one, two]
one
two
null

由于我们的队列只有两个元素,当我们第三次尝试调用 poll() 方法时,它会返回 null 值,如上所示。

Java 队列检查操作

在本节中,我们将通过一些有用的示例详细讨论 Java 队列检查操作。如果此操作执行成功,它将返回队列的头元素而不删除它。我们知道,Queue 支持两种形式的检查操作:

  • 队列.element(): 如果操作失败,它会抛出异常。- Queue.peek(): 如果操作失败,它会返回一个特殊值。

NOTE:-这里的特殊值可以是“false”或“null”

队列元素()操作

element() 操作用于从队列头部检索元素,而不删除它。如果检查操作成功,则返回队列的头元素。否则它会抛出 java.util.NoSuchElementException。让我们开发一个简单的示例来演示此功能。

import java.util.*;

public class QueueElementOperation {
   public static void main(String[] args) {
		
	Queue<String> queue = new LinkedList<>();
	queue.add("one");
		
	System.out.println(queue.element());
	System.out.println(queue);
	queue.clear();
	System.out.println(queue.element());
   }
}

Output:-当我们运行上面的程序时,我们将得到以下输出:

one
[one]
Exception in thread "main" java.util.NoSuchElementException

如果我们尝试在空队列上调用 element() 方法,它会抛出异常,如上所示。

队列 peek() 操作

peek() 操作用于从队列头部检索元素,但不删除它。如果检查操作成功,则返回队列的头元素。否则返回空值。让我们开发一个简单的示例来演示此功能。

import java.util.*;

public class QueuePeekOperation {
   public static void main(String[] args) {
		
	Queue<String> queue = new LinkedList<>();
	queue.add("one");
		
	System.out.println(queue.peek());
	System.out.println(queue);
	queue.clear();
	System.out.println(queue.peek());
   }
}

Output:-当我们运行上面的程序时,我们将得到以下输出:

one
[one]
null

如果我们尝试在空队列上调用 peek() 方法,它会返回 null 值,但不会抛出异常,如上所示。

Java 队列类别

在Java中,我们可以找到很多Queue的实现。 W大致可以分为以下两类

  • 有界队列
  • 无界队列

有界队列是受容量限制的队列,这意味着我们需要在创建时提供队列的最大大小。例如 ArrayBlockingQueue(参见前面的示例)。无界队列是不受容量限制的队列,这意味着我们不应该提供队列的大小。例如 LinkedList(参见前面的示例)。 java.util 包中可用的所有队列都是无界队列,而 java.util.concurrent 包中可用的队列是有界队列。从其他方面来说,W可以将它们大致分为以下两种类型:

  • 阻塞队列
  • 非阻塞队列

所有实现BlockingQueue接口的队列都是阻塞队列,其余的都是非阻塞队列。 BlockingQueues 会阻塞,直到完成工作或超时,但 Non-BlockingQueues 不会。有些队列是Deque,有些队列是PriorityQueue。

阻塞队列操作

除了 Queue 的两种操作形式外,BlockingQueue 还支持两种形式,如下所示。

Operation Throws exception Special value Blocks Times out
Insert add(e) offer(e) put(e) offer(e, time, unit)
Remove remove() poll() take() poll(time, unit)
Examine element() peek() N/A N/A

一些操作会被阻止,直到完成其工作,而其他操作会被阻止,直到超时。这就是关于 Java 队列的所有快速综述。我希望这些 Java 队列示例将帮助您开始队列集合编程。如果您喜欢我的教程或有任何建议、问题或输入错误,请给我评论。谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 队列 – Java 中的队列 的相关文章

随机推荐

  • 如何在 Debian 10 上安装 CouchDB

    Apache CouchDB 是由 Apache 软件基金会开发的免费开源 NoSQL 数据库 它可以用作单节点或集群数据库 CouchDB 服务器将其数据存储在命名数据库中 其中包含具有以下内容的文档JSON结构 每个文档由许多字段和附件
  • ​如何将 Debian 9 Stretch 升级到 Debian 10 Buster

    经过两年多的开发 新的 Debian 稳定版本 代号 Buster 的 Debian 10 于 2019 年 7 月 6 日发布 并将支持 5 年 此版本附带了大量新软件包和主要软件升级 Debian 10 buster 附带 Linux
  • 如何在 CentOS 8 上安装 GCC(开发工具)

    GNU 编译器集合 GCC 是 C C Objective C Fortran Ada Go D 编程语言 很多开源项目 包括Linux内核和GNU工具 都是使用GCC编译的 本文介绍如何在 CentOS 8 上安装 GCC 在 CentO
  • 你应该知道的 Nginx 命令

    Nginx 发音为 engine x 是一个免费 开源 高性能的 HTTP 和反向代理服务器 负责处理互联网上一些最大网站的负载 它可以用作独立的 Web 服务器 也可以用作反向代理适用于 Apache 和其他 Web 服务器 如果您是开发
  • 如何在 Linux 中挂载和卸载文件系统

    在 Linux 和 UNIX 操作系统上 您可以使用mount用于在目录树中的特定安装点附加 安装 文件系统和可移动设备 例如 USB 闪存驱动器 的命令 The umount命令从目录树中分离 卸载 已安装的文件系统 在本教程中 我们将介
  • 如何在 JavaScript 中使用 Switch 语句

    介绍 条件语句是所有编程语言中最有用和最常见的功能之一 如何在 JavaScript 中编写条件语句描述了如何使用if else and else if关键字根据不同的条件控制程序的流程 在 JavaScript 中通常是用户输入的结果 此
  • 如何生成带校验和的资源标识符

    作者选择了免费开源基金接受捐赠作为为捐款而写程序 介绍 唯一标识符 UID 或身份标识 可以是字符串值或整数 API 开发人员经常使用它们来寻址 API 中的唯一资源 然后 API 使用者使用这些标识符从资源集合中获取单个资源 如果没有唯一
  • 如何在 Debian 11 上安装和使用 Composer

    介绍 Composer是一个流行的 PHP 依赖管理工具 创建主要是为了方便项目依赖的安装和更新 Composer 的工作原理是检查特定项目所依赖的其他软件包 然后根据项目需求使用适当的版本为您安装它们 Composer 还常用于引导基于流
  • 如何编写您的第一个 Ruby 程序

    介绍 你好 世界 程序是计算机编程中经典且历史悠久的传统 对于初学者来说 这是一个小而完整的第一个程序 并且是确保正确配置环境的好方法 本教程将引导您完成用 Ruby 创建该程序 但是 为了使程序更有趣 您将修改传统的 Hello Worl
  • Java 中的矩阵程序

    矩阵是一个矩形数组 元素按行和列排列 在本教程中 我们将了解一些 Java 矩阵程序 矩阵的图形表示 Matrix Java 中的矩阵 我们可以使用矩阵来实现Java中的二维数组 可以使用索引 array r c 访问行 r 和列 c 的元
  • 什么是平衡二叉树以及如何检查它?

    对于二叉树 如果树是倾斜的 那么执行操作时计算效率就会降低 这就是确保树木不倾斜的动机 因此需要平衡二叉树 什么是平衡二叉树 平衡二叉树在计算上执行操作是高效的 平衡二叉树将遵循以下条件 任意节点左右子树高度差的绝对值小于1 对于每个节点
  • Java 15 特性

    保持六个月周期的传统 发布后Java 142020 年 3 月 17 日 我们现在有了 Java 15 下一个非 LTS 版本将于 2020 年 9 月 15 日推出 Java 15 特性 下面快速浏览一下 Java 15 的功能 密封课程
  • 如何在 Debian 11 上设置 NFS 挂载

    介绍 NFS 网络文件系统 是一种分布式文件系统协议 允许您在服务器上挂载远程目录 这允许您管理不同位置的存储空间并从多个客户端写入该空间 NFS 提供了一种相对标准且高性能的方式来通过网络访问远程系统 并且在必须定期访问共享资源的情况下运
  • Log4j 级别示例 - 顺序、优先级、自定义过滤器

    如果您使用过 log4j 您会注意到有很多方法来记录消息 例如 logger trace My Log message logger debug My Log message logger info My Log message 实际上它们
  • 如何在 Ubuntu 12.04 LTS 上设置 Apache 虚拟主机

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • json-简单示例

    json simple 是一个简单的 JSON java 工具包 json simple 库完全符合 JSON 规范 RFC4627 json 简单 json simple uses Map and List internally for
  • 如何在R中使用sample()获取样本?

    让我们了解 R 中最常用的函数之一 sample 在数据分析中 对数据进行采样是分析师最常见的过程 要研究和理解数据 有时采样是最好的方法 对于大数据来说尤其如此 R 提供标准函数sample 来从数据集中获取样本 许多业务和数据分析问题都
  • 如何在 Ubuntu 16.04 上使用 Webmin、LAMP、BIND 和 PostFix 安装 Virtualmin

    介绍 Webmin是一个 Web 前端 允许您通过浏览器远程管理服务器 虚拟分钟是Webmin的一个插件 可以通过单个界面简化多个虚拟主机的管理 类似于cPanel or Plesk 使用 Virtualmin 您可以管理用户帐户 Apac
  • Python等待时间,等待用户输入

    有时我们希望 python 程序在执行下一步之前等待特定的时间 我们可以用时间模块 sleep 函数将我们的程序暂停指定的秒数 Python等待时间 让我们看一个简单的示例 在执行进一步的语句之前 我们将暂停程序 5 秒钟 import t
  • Java 队列 – Java 中的队列

    Java Queue is an interface available in java util package and extends java util Collection interface Just like Java List