Java优先级队列

2023-11-19

我们时不时地需要以特定的顺序处理队列中的项目。优先级队列是一种完成这项工作的数据结构。 Java优先级队列与“普通”不同queue。它不是“先进先出”,而是按优先级顺序检索项目。

Java优先级队列

The java.util.PriorityQueue class, provides us an implementation of such a data type, by using priority heap implementation internally. Java PriorityQueue is an unbounded queue. It was introduced in Java 1.5 and enhanced in Java SE 8 release. PriorityQueue is internally implemented by following “Priority Heap” data structure. Here is the PriorityQueue class hierarchy: Priority Queue Java PriorityQueue Class Diagram: Java PriorityQueue Class Diagram

Java PriorityQueue 构造函数

  1. 优先队列()- 创建一个具有默认初始容量的 PriorityQueue,即 11
  2. 优先级队列(集合c)- 使用指定集合中的元素创建一个 PriorityQueue
  3. PriorityQueue(int 初始容量)- 创建具有指定初始容量的 PriorityQueue
  4. PriorityQueue(int initialCapacity, Comparator 比较器)- 使用提供的初始容量创建一个 PriorityQueue,其元素的顺序根据指定的比较器
  5. 优先队列(优先队列c)- 创建一个包含指定优先级队列中元素的 PriorityQueue
  6. 优先队列(SortedSet c)- 创建一个包含指定排序集中元素的 PriorityQueue

优先级队列元素按其自然顺序排序,除非我们提供Comparator在创建它的同时。默认情况下,元素按升序排列,因此队列的头部是优先级最低的元素。如果有两个元素同时有资格成为头部,那么这种联系就被任意打破。

Java 优先级队列示例

让我们创建一个PriorityQueue,包含各种任务:

PriorityQueue tasks=new PriorityQueue();
tasks.add("task1");
tasks.add("task4");
tasks.add("task3");
tasks.add("task2");
tasks.add("task5");

这将创建一个任务的 PriorityQueue,它将按任务的自然顺序进行排序String。让我们创建另一个 PriorityQueue,它以与自然顺序相反的顺序对任务进行排序。所以我们需要传递一个比较器:

PriorityQueue reverseTasks=new PriorityQueue(Comparator.reverseOrder());
reverseTasks.add("task1");
reverseTasks.add("task4");
reverseTasks.add("task3");
reverseTasks.add("task2");
reverseTasks.add("task5");

Java 优先级队列方法

现在,让我们看一下 PriorityQueue 的所有可用方法并使用它们:

  1. 布尔加法(E e)- 此方法将指定元素插入队列中。我们已经使用此方法在队列中添加了 5 个任务。

  2. 比较器 比较器()- 此方法返回用于对该队列中的元素进行排序的比较器。如果未指定比较器并且队列根据其元素的自然顺序进行排序,则返回 null。所以,如果我们这样做:

    System.out.println(tasks.comparator());
    System.out.println(reverseTasks.comparator());
    

    输出将是:

    null
    java.util.Collections$ReverseComparator@15db9742
    
  3. 布尔值包含(对象o)- 如果队列包含指定元素,则返回 true。让我们检查“task3”是否属于优先级队列任务:

    System.out.println(tasks.contains("task3"));
    

    这打印:

    true
    
  4. 布尔报价(E e)- 就像add()方法一样,该方法也向队列添加一个元素。对于容量受限的队列,offer() 和 add() 方法实际上有点不同,但对于 PriorityQueue,两者是相同的。与 add() 不同,offer() 即使未能将元素添加到队列中也不会抛出异常。

  5. E peek()- 检索此队列的头部,如果此队列为空,则返回 null。换句话说,它返回具有最高优先级的元素。所以下面的代码:

    System.out.println(tasks.peek());
    System.out.println(reverseTasks.peek());
    

    给我们:

    task1
    task5
    
  6. E poll()- 此方法还检索队列的头部(具有最高优先级的元素),或者如果队列为空则返回 null。但与 peek() 不同的是,它还会删除该元素。因此,如果我们调用 poll():

    System.out.println(“Poll on tasks: ”+tasks.poll());
    System.out.println(“Poll on reverseTasks: ”+reverseTasks.poll());
    

    然后看一下:

    System.out.println(“Peek on tasks: ”+tasks.peek());
    System.out.println(“Peek on reverseTasks: ”+reverseTasks.peek());
    

    我们将得到以下输出:

    Poll on tasks: task1
    Poll on reverseTasks: task5
    Peek on tasks: task2
    Peek on reverseTasks: task4
    
  7. 整数大小()- 返回队列中元素的数量。

  8. 布尔删除(对象o)- 从队列中删除指定元素(如果存在)。如果存在两个相同的元素,则仅删除其中之一。

  9. 对象[] toArray()- 返回一个包含队列中所有元素的数组。

  10. T[] toArray(T[] a)- 返回一个包含队列中所有元素的数组,返回数组的类型为指定数组的类型。

  11. 迭代器 迭代器()- 返回队列的迭代器。

  12. 无效清除()- 从队列中删除所有元素。

除了这些之外,PriorityQueue还继承了方法Collection and Object类。

Java PriorityQueue 时间复杂度

  1. 对于入队和出队方法,时间复杂度为 O(log(n))
  2. 对于remove(Object)和contains(Object)方法,时间复杂度是线性的
  3. 对于检索方法,具有恒定的时间复杂度

优先级队列的这种实现不是线程安全的。所以,如果我们需要同步访问,我们需要使用优先级阻塞队列。参考:API Doc

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

Java优先级队列 的相关文章

随机推荐

  • 如何在 CentOS 8 上安装 Skype

    Skype是世界上最流行的通信应用程序之一 它允许您免费拨打在线音频和视频电话 并以经济实惠的价格拨打全球手机和固定电话 本文介绍如何在 CentOS 8 上安装最新版本的 Skype 在 CentOS 上安装 Skype Skype 不是
  • 如何在 Ubuntu 20.04 上安装 Ruby

    Ruby 是当今最流行的编程语言之一 它具有优雅的语法 注重简单性和生产力 Ruby 是强大的 Ruby on Rails 框架背后的语言 在本教程中 我们将向您展示在 Ubuntu 20 04 上安装 Ruby 的三种不同方法 来自标准
  • 如何在 CentOS 7 上安装 Node.js 和 npm

    Node js 是一个跨平台的 JavaScript 运行时环境 允许服务器端执行 JavaScript 代码 Node js 主要用于后端 但作为全栈和前端解决方案也很受欢迎 npm 是 Node Package Manager 的缩写
  • 如何在 CentOS 8 上安装 Tomcat 9

    Apache Tomcat 是 Java Servlet JavaServer Pages Java 表达式语言和 Java WebSocket 技术的开源实现 它是当今世界上采用最广泛的应用程序和 Web 服务器之一 Tomcat 使用简
  • 如何在 Debian 9 上安装 Asterisk

    Asterisk 是最流行且广泛采用的用于构建通信应用程序的开源框架 它被世界各地的个人 小型企业 大型企业和政府使用 Asterisk 功能包括电话会议 语音邮件 等待音乐 呼叫转接 呼叫排队 呼叫录音 数据库存储 检索等等 在本教程中
  • 如何在 CentOS 7 上安装 Minecraft 服务器

    我的世界 是有史以来最受欢迎的游戏之一 这是一款关于放置方块并进行冒险的沙盒视频游戏 在本教程中 我们将完成在 CentOS 7 上安装和配置 Minecraft 服务器所需的步骤 我们将使用 Systemd 来运行 Minecraft 服
  • 如何在 CentOS 7 上安装 Elasticsearch

    Elasticsearch 是一个开源分布式全文搜索和分析引擎 它支持 RESTful 操作 允许您实时存储 搜索和分析大量数据 Elasticsearch 是最流行的搜索引擎之一 为具有复杂搜索要求的应用程序 例如大型电子商务商店和分析应
  • Linux 中的 Tar 命令(创建和提取档案)

    The tar命令通过将一组文件转换为存档来创建 tar 文件 它还可以提取 tar 存档 显示存档中包含的文件列表 向现有存档添加其他文件以及各种其他类型的操作 Tar 最初设计用于创建档案以将文件存储在磁带上 这就是它得名 的原因 Ta
  • 如何在 Ubuntu 18.04 上启用 SSH

    Secure Shell SSH 是一种加密网络协议 用于客户端和服务器之间的安全连接 在本教程中 我们将向您展示如何在 Ubuntu 桌面计算机上启用 SSH 启用 SSH 将允许您远程连接到 Ubuntu 计算机并安全地传输文件或执行管
  • Spring Boot @SpringBootApplication,SpringApplication 类

    春季启动 SpringBootApplication注解 春季启动 SpringBootApplication注解用于标记一个配置类 该类声明了一个或多个 Bean方法和触发器auto configuration和组件扫描 这与声明一个类相
  • 如何在 Ruby 中使用字符串

    介绍 A string是一个或多个字符的序列 可以由字母 数字或符号组成 Ruby 中的字符串是对象 与其他语言不同 字符串是mutable 这意味着可以就地更改它们 而不用创建新字符串 您几乎会在编写的每个程序中使用字符串 字符串允许您使
  • 有用的 Bash 别名和函数简介

    介绍 在命令行上操作的越多 您就越会发现您使用的大多数命令只是可用命令的很小的子集 大多数任务都是习惯性的 您可能每天都以相同的方式运行这些任务 虽然许多最常见的命令实用程序的制造商试图通过使用缩写名称来消除无关的输入 想想通过输入 ls
  • 在 Ubuntu 14.04 上使用 Consul(服务发现系统)简介

    介绍 Consul是一个分布式 高可用 数据中心感知的服务发现和配置系统 它可用于在灵活而强大的界面中呈现服务和节点 使客户端始终能够了解其所属基础设施的最新视图 Consul 提供了许多不同的功能 用于提供有关您的基础设施的一致且可用的信
  • 如何在 Ubuntu 22.04 上使用 uWSGI 和 Nginx 为 Flask 应用程序提供服务

    介绍 在本指南中 您将使用FlaskUbuntu 22 04 上的微框架 本文的大部分内容将讨论如何设置uWSGI应用服务器以及如何启动应用程序和配置Nginx充当前端反向代理 先决条件 在开始本指南之前 您应该 安装了 Ubuntu 22
  • 如何使用 Nginx、Let's Encrypt 和 Docker Compose 保护容器化 Node.js 应用程序

    介绍 有多种方法可以增强您的灵活性和安全性Node js应用 用一个反向代理 like Nginx为您提供负载平衡请求 缓存静态内容和实施传输层安全 TLS 在服务器上启用加密 HTTPS 可确保与应用程序之间的通信保持安全 在容器上使用
  • Python 中的 numpy.append()

    Python numpyappend 函数用于合并两个数组 该函数返回一个新数组 原数组保持不变 NumPy append 语法 函数语法为 numpy append arr values axis None The arr可以是类似数组的
  • 如何使用 Apache 和 Nginx 创建临时和永久重定向

    介绍 HTTP 重定向或 URL 重定向是一种将一个域或地址指向另一个域或地址的技术 重定向有很多用途 并且需要考虑几种不同类型的重定向 每当站点需要将请求一个地址的人定向到另一个地址时 就会使用重定向 当您创建内容和管理服务器时 您经常会
  • eclipse.ini vm 参数 - eclipse.ini 文件位置 Mac、Windows

    eclipse ini是用于控制Eclipse启动的配置文件 我们可以使用 Xms Xmx 参数配置 Eclipse VM 参数 例如要使用的 JDK eclipse ini vm permgen 空间 最大和最小堆大小 eclipse i
  • 如何在 Java 中将字符串转换为数组

    有时我们不得不分开字符串到数组基于分隔符或某些正则表达式 例如 读取 CSV 文件行并解析它们以将所有数据获取到字符串数组 在本教程中 我们将学习如何在 Java 程序中将字符串转换为数组 Java 中的字符串到数组 字符串类split S
  • Java优先级队列

    我们时不时地需要以特定的顺序处理队列中的项目 优先级队列是一种完成这项工作的数据结构 Java优先级队列与 普通 不同queue 它不是 先进先出 而是按优先级顺序检索项目 Java优先级队列 The java util PriorityQ