PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于优先级堆的极大优先级队列。优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列(参阅 Comparable),也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)
优先级队列是无界的,但是有一个内部容量,控制着用于存储队列元素的数组大小。它通常至少等于队列的大小。随着不断向优先级队列添加元素,其容量会自动增加。无需指定容量增加策略的细节
简单应用:
package test; import java.util.PriorityQueue; public class PriorityQueueTest1 { @SuppressWarnings("unchecked") public static void main(String[] args) { PriorityQueue queue = new PriorityQueue(); queue.add("AAAAA"); // Add接受的参数是Obj,PriorityQueue使用integer String等基本的数据类型时,默认new时有参数,如果不写则是按照默认排序 queue.add("BBBBB"); queue.add("CCCCC"); queue.add("DDDDD"); System.out.println(queue.peek()); // 获取但不移除此队列的头 System.out.println(queue.poll()); // 获取并移除此队列的头 System.out.println(queue.poll()); queue.offer("ZZZZZ"); // 将指定的元素插入此优先级队列 System.out.println(queue.poll()); System.out.println(queue.poll()); System.out.println(queue.poll()); System.out.println(queue.poll()); // 到这里已经没有元素,打印Null } }
定义比较器:
package test; import java.util.Comparator; import java.util.PriorityQueue; @SuppressWarnings("unchecked") public class PriorityQueueTest2 { private static PriorityQueue queue = new PriorityQueue(10,new Comparators()); public static void main(String[] args) { QueueObject queueObject = new QueueObject(); queueObject.setId(4); queueObject.setObject("AAAAA"); queue.add(queueObject); QueueObject queueObject1 = new QueueObject(); queueObject1.setId(1); queueObject1.setObject("BBBBB"); queue.add(queueObject1); QueueObject queueObject2 = new QueueObject(); queueObject2.setId(3); queueObject2.setObject("CCCCC"); queue.add(queueObject2); System.out.println(((QueueObject)queue.poll()).getObject()); System.out.println(((QueueObject)queue.poll()).getObject()); System.out.println(((QueueObject)queue.poll()).getObject()); } } class QueueObject { private int id; private Object object; public int getId() { return id; } public void setId(int id) { this.id = id; } public Object getObject() { return object; } public void setObject(Object object) { this.object = object; } } @SuppressWarnings("unchecked") class Comparators implements Comparator{ public int compare(Object arg0, Object arg1) { int val1 = ((QueueObject)arg0).getId(); int val2 = ((QueueObject)arg1).getId(); return val1 < val2 ? 0 : 1; } }
注意事项:
注意1:该队列是用数组实现,但是数组大小可以动态增加,容量无限。
注意2:此实现不是同步的。不是线程安全的。如果多个线程中的任意线程从结构上修改了列表, 则这些线程不应同时访问 PriorityQueue 实例,这时请使用线程安全的PriorityBlockingQueue 类。
注意3:不允许使用 null 元素。
注意4:此实现为插入方法(offer、poll、remove() 和 add 方法)提供 O(log(n)) 时间;
为 remove(Object) 和 contains(Object) 方法提供线性时间;
为检索方法(peek、element 和 size)提供固定时间。
注意5:方法iterator()中提供的迭代器并不保证以有序的方式遍历优先级队列中的元素。
至于原因可参考下面关于PriorityQueue的内部实现
如果需要按顺序遍历,请考虑使用 Arrays.sort(pq.toArray())。
注意6:可以在构造函数中指定如何排序。如:
PriorityQueue()
使用默认的初始容量(11)创建一个 PriorityQueue,并根据其自然顺序来排序其元素(使用 Comparable)。
PriorityQueue(int initialCapacity)
使用指定的初始容量创建一个 PriorityQueue,并根据其自然顺序来排序其元素(使用 Comparable)。
PriorityQueue(int initialCapacity, Comparator comparator)
使用指定的初始容量创建一个 PriorityQueue,并根据指定的比较器comparator来排序其元素。
注意7:此类及其迭代器实现了 Collection 和 Iterator 接口的所有可选 方法。
PriorityQueue的内部实现
PriorityQueue对元素采用的是堆排序,头是按指定排序方式的最小元素。堆排序只能保证根是最大(最小),整个堆并不是有序的。
方法iterator()中提供的迭代器可能只是对整个数组的依次遍历。也就只能保证数组的第一个元素是最小的
请您到ITEYE网站看 java小强 原创,谢谢!
http://cuisuqiang.iteye.com/ !
自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!
相关推荐
优先级队列头文件priorityqueue.h
优先级队列cpp文件PriorityQueue.cpp
在Java中,优先级队列是通过`java.util.PriorityQueue`类来实现的,它基于一个二叉堆(Binary Heap)的数据结构。本文将深入探讨优先级队列的概念、实现方式以及如何在实际编程中使用。 首先,理解二叉堆是理解...
总结来说,“PriorityQueue-MEX-Matlab”是一个利用MEX技术在MATLAB中实现的优先级队列库,它提供了一套高效的接口,便于在MATLAB环境中进行优先级队列的操作,如插入、删除和查询等。这个项目可能还包括了一些示例...
优先级队列是一种特殊的数据结构,它按照优先级顺序存储元素,最高优先级的元素总是在队列的前端。在计算机科学中,堆通常被用来实现优先级队列。堆是一种完全二叉树,其中每个父节点的值都大于或等于(最大堆)或...
PriorityQueue.m是MATLAB脚本或函数文件,很可能包含了优先级队列的实现代码。license.txt通常包含软件许可信息,说明了这些源代码的使用条件和限制。ignore.txt则可能是Git或版本控制系统中的忽略文件,指定了在...
- **PriorityQueue(PriorityQueue<? extends E> c)**:创建包含指定优先级队列元素的`PriorityQueue`。 - **PriorityQueue(SortedSet<? extends E> c)**:创建包含指定有序集元素的`PriorityQueue`。 #### 方法介绍...
Java的优先队列(PriorityQueue)是Java集合框架中一个重要的数据结构,它是一个基于堆实现的无界队列。优先队列中的元素按照优先级排序,最高的优先级元素总是在队列的头部。在Java中,PriorityQueue类位于`java....
下面的类利用 heapq 模块实现了一个简单的优先级队列: import heapq class PriorityQueue: def __init__(self): self._queue = [] self._index = 0 def push(self, item, priority): heapq.heappush(self._...
《MatlabPriorityQueue: 为Matlab编写的优先级队列》 在计算机科学中,优先级队列是一种特殊的数据结构,它允许我们按照优先级处理元素,而非按照它们进入队列的顺序。这种数据结构在许多算法和应用中都扮演着关键...
在Java编程中,优先队列(PriorityQueue)是一种特殊的队列,它按照元素的优先级进行出队。这种数据结构在实现多路归并排序(Multi-Merge Sort)时非常有用,因为它能有效地处理多个已排序的输入流,并将它们合并成...
- **内部实现**:Java的`PriorityQueue`类已经实现了小根堆,我们可以通过直接使用这个类来创建优先级队列,如`PriorityQueue<Integer> queue = new PriorityQueue();`,然后可以调用`offer()`、`poll()`等方法进行...
优先级队列的核心特性包括: 1. **数据结构**:PriorityQueue使用二叉堆作为其数据结构,通常是一个最小堆,保证队头元素是最小的。 2. **比较规则**:队列中的元素必须实现Comparable接口,或者在创建队列时提供...
使用C#中的二进制堆的自定义优先级队列实现。为个人/俱乐部项目编写。 (据我所知)它符合大多数.NET标准。不是线程安全的。 信息 这段代码是从Java项目转换为利用C#功能集并在结构上更合理的东西。虽然原始的Java...
### 7、优先级队列:PriorityQueue.h 优先级队列是一种特殊类型的队列,其中元素根据其优先级进行排序。通常使用堆数据结构来实现高效的操作,如插入和查找最高优先级的元素。 ### 8、串:MyString.h 字符串(串...
Java中的优先级队列(PriorityQueue)是一种特殊的队列,它按照元素的优先级进行排序。在Java集合框架中,PriorityQueue是位于java.util包下的一个类,它实现了Queue接口,但并不保证按照先进先出(FIFO)的顺序进行...
优先级队列在Java中通过`java.util.PriorityQueue`类实现,这个类是一个无界并发容器,它不保证队列的元素顺序,而是基于最小堆的数据结构来维护元素的顺序,使得每次删除元素时都是当前队列中优先级最高的元素。...
复杂度 时间复杂度 空间复杂度 线性数据结构动态数组(ArrayList) 链表(LinkedList) 单向链表 双向链表 循环链表 静态链表 栈(Stack) 队列(Queue) 双端队列(Deque) ...优先级队列(PriorityQueue)
优先队列(PriorityQueue)是数据结构中的一种特殊类型,它在处理元素的插入和删除时,不遵循传统的先进先出(FIFO)或后进先出(LIFO)原则,而是根据元素的优先级来决定操作顺序。在许多算法问题和实际应用中,...