# Java集合Queue-ArrayDeque有什么作用
## 一、ArrayDeque概述
`ArrayDeque`是Java集合框架中一個重要的雙端隊列(Deque)實現,自Java 6引入。它基于**循環數組**數據結構實現,既可作為先進先出(FIFO)的隊列使用,也可作為后進先出(LIFO)的棧使用。
### 核心特性
- **動態擴容**:初始容量16,按需自動擴容為2的冪次方
- **非線程安全**:需外部同步保證線程安全
- **Null值禁止**:禁止插入null元素
- **高性能**:O(1)時間復雜度的頭尾操作
## 二、核心應用場景
### 1. 替代傳統Stack實現
```java
// 作為棧使用(推薦替代Stack類)
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1); // 入棧
stack.pop(); // 出棧
優勢對比:
特性 | ArrayDeque | Stack |
---|---|---|
同步開銷 | 無 | 有 |
擴容效率 | 更高 | 較低 |
迭代順序 | LIFO | LIFO |
// 作為隊列使用(替代LinkedList)
Queue<String> queue = new ArrayDeque<>();
queue.offer("A"); // 入隊
queue.poll(); // 出隊
性能對比(百萬次操作): - 入隊操作:ArrayDeque比LinkedList快約30% - 內存占用:ArrayDeque節省約40%內存
// 實現滑動窗口最大值(LeetCode 239)
public int[] maxSlidingWindow(int[] nums, int k) {
ArrayDeque<Integer> deque = new ArrayDeque<>();
int[] res = new int[nums.length - k + 1];
// ... 具體實現邏輯
}
transient Object[] elements; // 存儲元素的數組
transient int head; // 頭指針
transient int tail; // 尾指針
// 計算下一個插入位置
tail = (tail + 1) & (elements.length - 1) // 利用位運算代替取模
private void doubleCapacity() {
int newCapacity = elements.length << 1; // 雙倍擴容
Object[] a = new Object[newCapacity];
// 分兩段復制元素
System.arraycopy(elements, head, a, 0, elements.length - head);
System.arraycopy(elements, 0, a, elements.length - head, head);
}
初始化容量:預估最大元素數量,避免頻繁擴容
new ArrayDeque<>(100); // 指定初始容量
批量操作:優先使用addAll/removeAll方法
遍歷優化:
// 使用迭代器比for-each更高效
Iterator<String> it = deque.iterator();
while(it.hasNext()) {
String item = it.next();
}
特性 | ArrayDeque | LinkedList | PriorityQueue |
---|---|---|---|
數據結構 | 循環數組 | 雙向鏈表 | 堆 |
插入刪除時間復雜度 | O(1) | O(1) | O(log n) |
隨機訪問 | 不支持 | O(n) | 不支持 |
內存連續性 | 好 | 差 | 一般 |
適用場景 | 高頻頭尾操作 | 頻繁中間操作 | 優先級處理 |
// 實現簡單的任務隊列
ArrayDeque<Runnable> taskQueue = new ArrayDeque<>();
// 生產者線程
taskQueue.offer(() -> System.out.println("Task1"));
// 消費者線程
Runnable task = taskQueue.poll();
if(task != null) task.run();
// 實現文檔編輯的撤銷/重做功能
ArrayDeque<Action> undoStack = new ArrayDeque<>();
ArrayDeque<Action> redoStack = new ArrayDeque<>();
void performAction(Action action) {
action.execute();
undoStack.push(action);
redoStack.clear();
}
ArrayDeque作為Java集合框架中的高效雙端隊列實現,在需要頻繁進行隊列頭尾操作的場景下展現出顯著優勢。其設計巧妙結合了數組的隨機訪問特性和循環數組的空間復用機制,是替代傳統Stack和LinkedList的理想選擇。開發者應根據具體業務場景,合理選擇初始化參數和使用模式,以充分發揮其性能優勢。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。