PriorityQueue解析

  PriorityQueue是一个基于优先级堆的无界队列,它的元素根据自然顺序或者通过实现Comparator接口的自定义排序方式进行排序。一个优先级队列不允许null元素,并且当使用自然顺序排序时,不允许插入一个非排序元素(实现了Comparable接口),这样会导致ClassCastException异常抛出。

  优先级队列头是一个最小元素按照指定的排序。如果有多个元素并列为最小,则是任选其中一个作为队列头。方法iterator返回的迭代器不保证遍历到的元素是按照指定的顺序,如果需要有序的遍历,可考虑使用Arrays.sort(pq.toArray)方法。

  注意此实现不是同步的,当多个线程并发访问优先级队列并且有一个线程修改它的话,请使用线程安全的PriorityBlockingQueue代替。优先级队列提供了O(log(n))时间在出队和入队的方法上,比如:offer(),poll(),add()以及remove,但是对于检索操作如:peek(),element(),size()提供的是常量时间,同时提供了线性时间的remove(Object)和contains(Object)方法。

  尽管优先级队列不一定所有元素都是按序排列的,但是它能保证队列的头一定是最小的元素,这也是TreeSet和PriorityQueue的区别,前者能保证所有元素按序排列,而优先级队列仅仅保证列的头是有序的;另一个需要注意的地方是PriorityQueue并不允许null元素存在,如果尝试添加null值,那么就会抛出NullPointException异常。

时间: 2024-10-12 16:07:13

PriorityQueue解析的相关文章

Java Collection - PriorityQueue 优先队列

总结 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator,类似于C++的仿函数). Java中PriorityQueue实现了Queue接口,不允许放入null元素:其通过堆实现,具体说是通过完全二叉树(complete binary tree)实现的小顶堆(任意一个非叶子

给jdk写注释系列之jdk1.6容器(12)-PriorityQueue源码解析

PriorityQueue是一种什么样的容器呢?看过前面的几个jdk容器分析的话,看到Queue这个单词你一定会,哦~这是一种队列.是的,PriorityQueue是一种队列,但是它又是一种什么样的队列呢?它具有着什么样的特点呢?它的底层实现方式又是怎么样的呢?我们一起来看一下. PriorityQueue其实是一个优先队列,什么是优先队列呢?这和我们前面讲的先进先出(First In First Out )的队列的区别在于,优先队列每次出队的元素都是优先级最高的元素.那么怎么确定哪一个元素的优

java集合类型源码解析之PriorityQueue

本来第二篇想解析一下LinkedList,不过扫了一下源码后,觉得LinkedList的实现比较简单,没有什么意思,于是移步PriorityQueue. PriorityQueue通过数组实现了一个堆数据结构(相当于一棵完全二叉树),元素的优先级可以通过一个Comparator来计算,如果不指定Comparator,那么元素类型应该实现Comparable接口.最终compare得出的最小元素,放在堆的根部. 成员变量 public class PriorityQueue<E> extends

Queue(队列)接口和其实现类PriorityQueue(优先级队列)源码解析

前面介绍的Stack是新进后出,而Queue是先进先出的 1.Queue结构 public interface Queue<E> extends Collection<E> { boolean add(E e); boolean offer(E e); E remove(); E poll(); E element(); E peek(); } Queue是一个接口. 2.PriorityQueue源码分析 PriorityQueue是一个优先队列,和先进先出的队列的区别是: 优先

PriorityQueue类源码解析

所在包 package java.util; 继承AbstractQueue 实现java.io.Serializable public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializable { // 内部代码下面讲解 } 五个变量 private static final long serialVersionUID = -7720805057305804111L; // 默认

PriorityQueue源码解析

PriorityQueue是一种什么样的容器呢?看过前面的几个jdk容器分析的话,看到Queue这个单词你一定会,哦~这是一种队列.是的,PriorityQueue是一种队列,但是它又是一种什么样的队列呢?它具有着什么样的特点呢?它的底层实现方式又是怎么样的呢?我们一起来看一下. PriorityQueue其实是一个优先队列,什么是优先队列呢?这和我们前面讲的先进先出(First In First Out )的队列的区别在于,优先队列每次出队的元素都是优先级最高的元素.那么怎么确定哪一个元素的优

JDK 1.8 源码解析 PriorityQueue

package java.util; public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializable // 序列化版本号 private static final long serialVersionUID = -7720805057305804111L; // 默认初始容量 private static final int DEFAULT_INITIAL_CAPACITY

c#网络通信框架networkcomms内核解析之十 支持优先级的自定义线程池

本例基于networkcomms2.3.1开源版本  gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池)就是皇冠上的明珠了,这样说应该不夸张的,她那么优美,简洁,高效. 在 <c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据>中我们曾经提到,服务器收到数据后,如果是系统内部保留类型数据或者是最高优先级数据,系统会在主线程中处理,其他的会交给自定义线程池进行处理. 作为服务器,处理成千上万的连接及数据,单线程性能

100多道经典的JAVA面试题及答案解析

面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码的可理解性. 面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象.下面的章节我们会逐个分析这些特性. 封装 封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在Java当中,有3种修饰符:public,private和protected.每一种修