1. 程式人生 > >Queue-PriorityQueue原始碼解析

Queue-PriorityQueue原始碼解析

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