优先队列有两种:最大优先队列,当前最大的元素优先出队;最小优先队列,当前最小的元素优先出队。api
PriorityQueue
经过用数组表示的小顶堆来实现,具体结构以下图所示数组
首先任何结点都小于其左右子结点,除此以外,对于任何一个结点,假设它的下标为n:函数
成员变量spa
构造函数code
看起来有7种实际上只有4种队列
除了第一种,其它的是对PriorityQueue
、SortedSet
和其它Collection
进行初始化,其中SortedSet
自己就已是排好序,因此不须要通过什么特殊处理,而其它的则须要调用heapify()
进行处理。rem
进入heapify()
源码能够看到用到了siftDown()
函数,后面会讲到源码
add
和offer
的语义是相同的,add
也是调用了offer
,主要的是扩容函数grow
和筛选函数siftUp
。扩容函数后面讲,先来分析筛选函数(siftUp/siftDown)。it
假设待插入的元素是4,这个gif图有个缺陷就是,比较完后,并非4和待比较的结点交换,而是单纯把父节点移下来。io
siftDown
和siftUp
差很少,都是包含有比较器和没有比较器两种方法,这里就拿一个分析便可。
因为查询并无涉及结构的变化和调整,因此源码是很是简单的。
扩容发生在添加元素的时候,当size >= queue.length
的时候就会发生扩容。