Vector,所有方法同步(線程安全但效能較低)Deque 介面實現(ArrayDeque 非同步、高效能)push() 入棧、pop() 出棧、peek() 查頂
Stack<Object> stack = new Stack<>();
// 1. 基本狀態
stack.empty(); // true
// 2. 入棧
stack.push(123);
stack.push("xyz");
stack.push(456);
stack.push("xyz"); // 允許重複
// 3. 查頂(不移除)
stack.peek(); // "xyz" (頂部元素)
// 4. 搜索位置(1-based,頂部為 1)
stack.search(123); // 4 (從頂往下第 4 個)
stack.search("xyz"); // 1 (頂部最近的 "xyz")
// 5. 出棧循環
while (!stack.empty()) {
System.out.println(stack.pop()); // 依次輸出: "xyz", 456, "xyz", 123
}
| 方法 | 語義 | 異常情況 |
|---|---|---|
push(E item) | 壓入棧頂,返回 item | 無 |
pop() | 移除並返回棧頂 | 空棧拋 EmptyStackException |
peek() | 返回棧頂不移除 | 空棧拋 EmptyStackException |
empty() | 判斷是否為空 | 無 |
search(Object o) | 從頂向下找,返回 1-based 索引 | 未找到返回 -1 |
因繼承 Vector,間接擁有:
get(index)、set(index, elem)add(index, elem)、remove(index)
// 推薦:ArrayDeque(非同步、雙端、效能優於 Stack)
Deque<String> stack = new ArrayDeque<>();
stack.push("a"); // 入棧
stack.push("b");
stack.peek(); // "b"
stack.pop(); // "b"
stack.isEmpty(); // false
| 特性 | Stack | ArrayDeque |
|---|---|---|
| 線程安全 | 同步方法 | 非同步(單執行緒高效) |
| 擴容機制 | Vector 擴容 2 倍 | 雙端循環數組,動態擴容 |
| 功能豐富度 | 僅 LIFO | 雙端隊列、棧、隊列三合一 |
| Null 元素 | 允許 | 禁止 |
if (!s.empty()) s.pop())非原子。用 ConcurrentLinkedDeque 或加鎖。EmptyStackException。Stack 是 LIFO 棧的經典實現,但因同步開銷、Vector 遺留包袱、功能單一,現代 Java 開發中強烈建議使用 ArrayDeque 替代。理解棧原理對掌握遞歸、解析器、記憶體模型等核心計算機科學概念至關重要。