java优先队列_什么是Java优先级队列?

该PriorityQueue中是很重要的一个Java的建立在无界优先级队列和优先级堆的API。本文通过适当的代码示例介绍了有关此API及其使用的一些复杂信息。

概观

的的PriorityQueue类是一部分的java.util包,是一个通用的实现Java中的基于优先级的队列。甲队列基本上是一个数据结构,用于定义特定规范来插入和从存放物品的检索的处理。这个想法非常类似于许多人站在队列中说,获得一张票。站在队列中的第一个人获得了获得机票的第一个机会,最后一个人获得了一个机会。人们被添加到队列的末尾或尾端。向队列添加项目在技术上称为入队过程,从队列中删除的项目来自行中的第一个项目。这被称为出队。我们的想法是以FIFO(先进先出)的方式对元素进行排序。

现在,这是最简单的架构,并且紧密地定义了队列实际意味着什么以及如何在计算机中进行模拟。甲商店通常由一个简单的阵列,其中所述存储和检索过程有这样的定义范数表示。优先级队列强加了一些特殊规范。我们将看到更多的内容。

Java实现队列

Java API 在java.util包中具有通用接口名称Queue 。这是Java Collection Framework API的一部分,旨在在处理之前保存元素。作为Collection的一部分,它具有所有基本的Collection操作。特定于其身份的操作涉及插入,提取和检查存储在其中的元素。这些操作中的每一个都有两种不同的形式,例如,如果操作失败则抛出异常,另一种返回特殊值,例如null或false,具体取决于操作。注意与典型队列不同,Java Queue的具体实现不一定以FIFO方式排序元素。对于基于优先级的队列尤其如此,其中元素的排序是根据提供的比较器或自然顺序完成的。但无论顺序如何,remove()或poll()方法将始终检索队列头部的元素。这两种不太可能的方法之间的具体区别似乎是一个类似的方法是一个抛出异常(NoSuchElementException)失败,而后者返回(null),一个特殊的值。

76837767a007e4391ec793f5ed552246.png
35cc0e9e82952ac8251ad763cf789fbf.png

请注意,Queue 接口不适合在并发编程中使用,因为它没有定义阻塞队列方法,其中enqueue和dequeue进程等待元素出现在队列中或大小可用。有一个名为BlockingQueue 的特定接口,它扩展了Queue 接口并解决了这些问题。

有一个名为AbstractQueue 的抽象类,它提供了一些队列操作的部分实现。所述的PriorityQueue 类是这个抽象类的直接延伸。

优先级队列

优先级队列的Java实现是一种特殊类型的队列,其中元素的排序由其自然排序原则确定或根据创建期间提供的比较器定制。我们在构造期间调用的构造函数决定了与优先级队列一起使用的排序原则。与Queue 不同,它不允许null元素,但是某些实现 - 例如LinkedList -do也不禁止插入null元素。但是,PriorityQueue 根本不允许使用null元素。如果优先级队列是根据自然顺序构造的,则会抛出任何不可比较的元素插入ClassCastException

它被声明是无限的并且基于优先级堆。虽然队列的大小被称为无界,但是有一个内部容量来确定数组的大小。插入元素时,此大小会自动增大。但是,没有具体说明尺寸增加的原则的细节。

有七种类型的重载构造函数,我们可以通过它们设置参数来指定队列的初始容量,为Comparator提供指定元素的自定义排序,或者使用无参数构造函数接受默认值。

  • PriorityQueue中()
  • PriorityQueue(int initialCapacity)
  • PriorityQueue(int initialCapacity,Comparator comparator)
  • PriorityQueue(Commection c)
  • PriorityQueue(比较器比较器)
  • PriorityQueue(PriorityQueue c)
  • PriorityQueue(SortedSet c)

Queue 类似,PriorityQueue 也不同步,因此应在并发编程中谨慎使用。但是,有一个同步替代它,称为PriorityBlockingQueue 。这与PriorityQueue 的工作方式相同,只是具有线程安全的附加资格。

PriorityQueue 中定义的操作与Queue 相同,但增加了一些。

64858640956c933ffeb3333be072cf67.png

快速示例#1

让我们用一个简单的程序实现PriorityQueue 的一些操作。

package org.mano.examples;import java.util.Arrays;import java.util.Iterator;import java.util.PriorityQueue;public class Example1 { public static void main(String[] args){ PriorityQueue pq = new PriorityQueue<>(); pq.add("Mercury"); pq.add("Venus"); pq.add("Earth"); pq.add("Mars"); pq.add("Jupiter"); pq.add("Saturn"); // Get the most priority element based upon // natural alphabetic ordering in string System.out.println("Priority element "+pq.peek()); // Queue elements show(pq); // Remove top of the queue element pq.poll(); show(pq); // Retrieves element from the head of the queue pq.remove("Earth"); show(pq); String result = pq.contains("Earth")? "Found Earth":"Earth Missing!"; System.out.println(result); Object[] arr = pq.toArray(); Arrays.sort(arr); System.out.println(""); for (int i = 0; i pq){ Iterator itr = pq.iterator(); while (itr.hasNext()) System.out.print(itr.next()+"::"); System.out.println(""); }}

产量

Priority element EarthEarth::Jupiter::Mercury::Venus::Mars::Saturn::Jupiter::Mars::Mercury::Venus::Saturn::Jupiter::Mars::Mercury::Venus::Saturn::Earth Missing!Jupiter::Mars::Mercury::Saturn::Venus::

快速示例#2

这是另一个自定义比较器的快速示例。

package org.mano.examples;import java.util.Comparator;import java.util.PriorityQueue;public class Planet implements Comparable{ private String name; private double orbitPeriodInDays; public Planet(String name, double orbitPeriodInDays) { this.name = name; this.orbitPeriodInDays = orbitPeriodInDays; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getOrbitPeriodInDays() { return orbitPeriodInDays; } public void setOrbitPeriodInDays(double orbitPeriodInDays) { this.orbitPeriodInDays = orbitPeriodInDays; } @Override public int compareTo(Planet o) { return 0; } @Override public String toString() { return "Planet{" + "name='" + name + ''' + 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值