Java Collections Framework 自 1.5 版起提供了 java.util.Queue 介面及 LinkedList、ArrayDeque、PriorityQueue、ConcurrentLinkedQueue 等豐富實作。但在教學、面試、或受限於舊版 JDK (1.4 以前) 環境時,理解如何基於基礎集合類 (如 Vector) 封裝線程安全隊列,極有助於掌握**集合封裝、同步控制、異常設計、介面導向程式設計**等核心功力。
| 操作 | 語義 | 異常行為 |
|---|---|---|
enq(E element) | 尾部插入元素 (入隊) | 容量受限時拋出 IllegalStateException (本範例 Vector 自動擴容,故不拋出) |
deq() | 移除並返回頭部元素 (出隊) | 隊列為空拋出 EmptyQueueException (自訂檢查型異常) |
front() | 查看但不移除頭部元素 | 隊列為空拋出 EmptyQueueException |
empty() | 判斷是否為空 | 返回 boolean |
clear() | 清空隊列 | 無返回值 |
search(Object o) | 查找元素距隊頭位置 (0-based) | 不存在返回 -1 |
Vector — 線程安全、動態陣列、支援索引存取、JDK 1.0 即存在。extends Vector (繼承實作) 或 **組合** (持有 Vector 私有欄位) —— **強烈建議組合**,避免暴露 Vector 所有 public 方法 (如 addElementAt, setElementAt) 破壞隊列語義。本範例為教學演示採用繼承,實務請改組合。synchronized (繼承自 Vector 方法已同步,但複合操作需額外同步)。EmptyQueueException extends Exception (檢查型異常),強制調用者處理空隊列情況。import java.util.Vector;
/**
* 自訂空隊列異常 (檢查型異常)
*/
class EmptyQueueException extends Exception {
public EmptyQueueException() {
super("Queue is empty");
}
public EmptyQueueException(String message) {
super(message);
}
}
/**
* 基於 Vector 的線程安全隊列實作 (教學示範版,生產環境請用 java.util.Queue 實作)
*/
public class Queue extends Vector
public class ArrayQueue implements Queue 。private final List data = new ArrayList<>(); (單執行緒) 或 new CopyOnWriteArrayList<>() / Collections.synchronizedList (多執行緒)。Object 強轉,編譯期類型安全。deq() 拋 NoSuchElementException (非檢查型,符合 JDK Queue 規約),或提供 poll() 返回 null。new ArrayDeque<>() (非執行緒安全、高效)、new ConcurrentLinkedQueue<>() (無鎖、高併發)、new LinkedBlockingQueue<>() (阻塞、生產消費者)。手寫隊列不是為了造輪子,而是為了**理解輪子的內部結構**。掌握封裝、同步、異常、介面設計原則,才能在面對並發編程、框架原理分析、效能調優時游刃有餘。**生產代碼請直接使用 JDK 提供的成熟 Queue 實作。**