首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Stack 棧完整解析:原理、源碼與實戰應用

     編輯:Java 程式設計入門

Stack 簡介

Stack<E> 實作後進先出 (LIFO) 棧結構,繼承自 Vector<E>,底層以動態陣列儲存。同步安全但效能較差,現代開發建議改用 ArrayDeque 或 LinkedList。

類繼承關係

Stack 繼承關係

Stack 與 Collection 關係

核心 API

方法說明同步
push(E item)壓入棧頂,回傳元素否
pop()彈出並移除棧頂元素是
peek()查看棧頂元素不移除是
empty()判斷是否為空否
search(Object o)從棧底向上搜尋,回傳 1-based 位置是

源碼核心邏輯 (JDK 8)

public class Stack<E> extends Vector<E> {
    public E push(E item) {
        addElement(item);  // Vector 尾部新增
        return item;
    }

    public synchronized E pop() {
        E obj = peek();
        removeElementAt(size() - 1);  // 移除最後一個
        return obj;
    }

    public synchronized E peek() {
        int len = size();
        if (len == 0) throw new EmptyStackException();
        return elementAt(len - 1);  // 直接取陣列最後一位
    }

    public boolean empty() { return size() == 0; }

    public synchronized int search(Object o) {
        int i = lastIndexOf(o);  // 從尾部向前找
        return (i >= 0) ? size() - i : -1;
    }
}

關鍵特性總結

  • 陣列實作:push 相當於陣列尾部 add,pop/peek 直接存取 elementData[size-1]
  • 繼承 Vector:擁有所有 Vector 方法,pop/peek/search 同步化
  • 1-based search:search 回傳距離棧頂距離 (頂=1),非索引值

實戰範例

Stack<String> stack = new Stack<>();
// 壓入 1~5
for (int i = 1; i <= 5; i++) stack.push(String.valueOf(i));

// 索引遍歷 (最快)
for (int i = 0; i < stack.size(); i++) 
    System.out.print(stack.get(i) + " ");  // 1 2 3 4 5

// 搜尋位置
System.out.println("\n位置: " + stack.search("2"));  // 4 (棧底=1, 棧頂=5)

// 彈出棧頂
stack.pop();  // 移除 5
// 查看新棧頂
System.out.println("Peek: " + stack.peek());  // 4

// Iterator 遍歷
for (Iterator<String> it = stack.iterator(); it.hasNext(); )
    System.out.print(it.next() + " ");  // 1 2 3 4

現代替代方案建議

// 非同步、效能更好、功能更豐富
Deque<String> stack = new ArrayDeque<>();
stack.push("a"); stack.push("b");
stack.pop();  // 彈出
stack.peek(); // 查看

// 或 LinkedList (同樣實作 Deque)
Deque<String> stack2 = new LinkedList<>();

結論:單線程、高效能場景請用 ArrayDeque;需同步可用 Collections.synchronizedDeque 包裝。Stack 屬 Legacy 類別,新專案不建議使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved