普通队列:先入先出 优先队列:出队和入队顺序无关,和优先级有关。
构建
```PriorityQueue<Integer> pq = new PriorityQueue<Integer>((o1,o2) -> o1-o2);
add()和offer()向队列中增加元素,add内部调用offer方法,两者没有什么区别;新加入的元素可能会破坏大顶堆/小顶堆(非叶子节点的权值不大于左右子节点的权值)的性质,所以需要调整元素在队列中的位置。具体为:向数组末尾添加一个元素,根据堆的性质,将元素与父节点进行比较并交换,直到满足元素大于等于/小于等于父元素值,即SiftUp(上浮)操作。
element()和peek()方法:获取但不删除队堆顶元素(数组下标为0的元素)(权值最大或最小元素),element()内部调用peek()方法,区别在于element失败时抛出异常,peek失败时返回null。
remove()和poll()方法:获取并删除堆顶元素,remove()内部调用poll()方法,区别在于remove()失败时抛出异常,peek()失败时返回null。删除可能会破坏大顶堆/小顶堆(非叶子节点的权值不大于左右子节点的权值)的性质,所以需要调整元素在队列中的位置。具体为:将数组末尾元素替换堆顶元素,根据堆的性质,将元素与左右孩子中较小或较大的那个进行交换,直至满足元素大于等于/小于等于左右孩子中较大或较小的那个元素值,即SiftDown(下浮)操作。需要注意的是:删除栈顶元素后,原数组大小不会变小。
remove()方法:用于删除队列中跟入参相等的一个元素。具体为:正向遍历数组找到第一个等于入参的元素的下标,如果下标时数组尾部则直接删除;否则从删除点开始,以最后一个元素为参照进行SiftDown操作。