Queue-PriorityQueue原始碼解析
阿新 • • 發佈:2020-05-13
Queue佇列通常是先進先出(FIFO),但也有特殊的非FIFO,如本文也分析的PriorityQueue。
## Queue介面
Queue介面定義的方法:
![](https://img2020.cnblogs.com/blog/1306925/202005/1306925-20200513175307394-1064891006.png)
新增元素介面:
1. add(E e) -> 往佇列新增一個元素,如果佇列已滿丟擲IllegalStateException異常。
2. offer(E e) -> 往佇列新增一個元素,true成功,false失敗,和add區別在與不會因為佇列已滿拋異常。
刪除元素介面:
1. remove() -> 刪除佇列頭元素並返回該元素,如果佇列為空丟擲NoSuchElementException異常。
2. E poll() -> 刪除佇列頭元素並返回該元素,如果佇列為空返回null(與remove不同)。
獲取佇列頭元素介面:
1. E element() -> 返回佇列頭部元素(沒有刪除),如果佇列為空丟擲NoSuchElementException異常。
2. E peek() -> 返回佇列頭部元素(沒有刪除),如果佇列為空返回null。
## Queue常用的實現類
![](https://img2020.cnblogs.com/blog/1306925/202005/1306925-20200513175330082-376605157.png)
上圖中列出的是Queue平時常用的實現類:
1. ArrayBlockingQueue -> 有邊界的陣列形式實現的阻塞佇列。
2. LinkedBlockingQueue -> 有邊界的連結串列形式實現的阻塞佇列。
3. PriorityQueue -> 無邊界的二叉堆形式實現的優先順序佇列。
4. DelayQueue -> 無邊界的優先順序形式實現的延遲佇列。
## PriorityQueue
PriorityQueue是基於二叉堆形式實現的無界佇列。佇列中元素型別必須是可比較的,建構函式如果沒有傳入Comparator預設是自然排序。
### PriorityQueue結構
![](https://img2020.cnblogs.com/blog/1306925/202005/1306925-20200513175349378-1458740.png)
PriorityQueue繼承了AbstractQueue,AbstractQueue實現Queue介面,即PriorityQueue擁有Queue的方法和特徵。
Object[] queue:存放佇列元素。
int DEFAULT_INITIAL_CAPACITY:預設的佇列大小,預設值為11。
int size:PriorityQueue佇列中元素個數。
int modCount:PriorityQueue佇列修改次數。
Comparator comparator:佇列元素排序比較器。
int MAX_ARRAY_SIZE:佇列最大值(Integer.MAX_VALUE - 8),VM的保留了8位元組的 header words。
### PriorityQueue示例
```java
package com.juc.queue;
import java.util.PriorityQueue;
/**
* Created on 2020/5/10 23:29.
* @author Griez
*/
public class PriorityQueueTest {
public static final Prior