原本想先看看DelayQueue,结果里面用到了PriorityQueue,因此先学习一下PriorityQueue的编码逻辑。html
基于优先级堆的无界优先级队列。优先级队列的元素根据其天然顺序排序,或者由队列构造时提供的比较器排序,具体取决于使用的构造函数。优先级队列不容许null元素。依赖于天然排序的优先级队列也不容许插入不可比较的对象(这样作可能致使ClassCastException)。java
此队列的头部是指定排序的最小元素。若是多个元素被绑定为最小值,则头部是这些元素之一。api
PriorityQueue是无限制的,但具备内部容量,用于控制用于存储队列中元素的数组的大小。它始终至少与队列大小同样大。当元素添加到优先级队列时,其容量会自动增长。数组
PriorityQueue不是线程安全的,因此多线程操做的时候要注意一下。安全
咱们能够看到PriorityQueue的构造方法比较多,咱们看一下比较有特色的,下面是赋值一个initialCapacity和比较器comparator的,若是没有初始化,那么会使用默认值DEFAULT_INITIAL_CAPACITY = 11多线程
还有对于集合的构造函数,这里对SortedSet和PriorityQueue特殊处理了一下,获取comparator,可是仍是有PriorityQueue(PriorityQueue<? extends E> c)和PriorityQueue(SortedSet<? extends E> c)两个构造函数,对于其余集合,是不会设置comparator。最终你们的归宿都是调用initElementsFromCollection,initFromPriorityQueue和initFromCollection。oracle
以上三个方法都是赋值this.queue和this.size,而后调用heapify构建堆,其中 >>> 是无符号右移,而后操做siftDown操做。函数
这个操做会根据有没有comparator,执行siftDownUsingComparator或者siftDownComparable。学习
等我梳理一些这个集合操做后,再慢慢看看这些构建的操做。this
peek()操做获取堆的头部信息
offer(E e):将指定的元素插入此队列,会先判断入参是否为null,而后判断数组大小是否足够,不然执行grow(int minCapacity)扩容,除非是第一个元素,不然会执行入堆的操做!
poll():检索并删除此队列的头部,若是此队列为空,则返回null。而后执行siftDown操做。
remove(Object o):今后队列中删除指定元素的单个实例(若是存在)。
此次看的有点粗糙,咱们后续再补充!
下节再续!
参考:https://docs.oracle.com/javase/9/docs/api/java/util/PriorityQueue.html
有什么讨论的内容,能够加我公众号: