1. 程式人生 > >Java集合原始碼分析06----Stack原始碼分析

Java集合原始碼分析06----Stack原始碼分析

目錄

簡介

介紹

案例

簡介

    Stack模擬的是棧的操作,繼承了Vector類,底層也是通過陣列來實現的。棧的資料特點是先進後出(FILO,First In Last Out),即最後壓入棧的元素,總是第一個彈出棧。由於Stack繼承了Vector,所以執行緒安全,並且提供了操作佇列的方法,可以隨機訪問,能克隆,能進行序列化和序列化傳輸。

介紹

1.構造方法

 public Stack() {}
  • 構建一個空的Stack.

2.內部方法

public E push(E item){}
public synchronized E pop() {}
public synchronized E peek() {}
public boolean empty() {}
public synchronized int search(Object o) {}
  • push(E item)----向棧頂壓入一個元素。
  • pop()----返回棧頂的元素,並從棧裡面移除。如果棧為空,將丟擲EmptyStackException異常。
  • peek()----返回棧頂的元素,不執行刪除操作。如果棧為空,將丟擲EmptyStackException異常。
  • empty()----如果棧為空,返回true。
  • search(object o)----查詢棧頂元素在棧中位置,返回元素到棧頂部的距離。

原始碼分析(基於jdk1.8)

public class Stack<E> extends Vector<E> {
     
  //建立空的Stack例項
    public Stack() {
    }

    //向棧頂壓入一個指定元素,底層呼叫的addElement()方法,並返回存入的元素。
    public E push(E item) {
        addElement(item);

        return item;
    }

    //返回棧頂的元素,並從棧中移除。
    //如果棧為空,將丟擲EmptyStackException異常
    public synchronized E pop() {
        E       obj;
        int     len = size();
        
        obj = peek();
        //移除最後一個元素。
        removeElementAt(len - 1);

        return obj;
    }

    //返回棧頂的元素,不執行移除操作。
    //如果棧為空,將丟擲EmptyStackException異常
    public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        //返回最後一個元素
        return elementAt(len - 1);
    }

    //如果棧為空,返回true。
    public boolean empty() {
        return size() == 0;
    }

    //查詢棧中指定元素,返回元素到棧頂部的距離。
    public synchronized int search(Object o) {
      //返回棧中最後出現指定元素的位置。
        int i = lastIndexOf(o);

        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    //序列化版本號
    private static final long serialVersionUID = 1224463164541339165L;
}

案例

Stack繼承了Vector,所以擁有Stack的大部分方法,這裡測試了棧的訪問。

public class StackDemo {
  public static void main(String[] args) {
    Stack<String> stack = new Stack<>();
    for(String word:"this is a demo about stack".split(" ")) {
      stack.push(word);
    }
    System.out.println("peek----"+stack.peek());
    while(!stack.isEmpty()) {
      System.out.print(stack.pop()+" ");
    }
    System.out.println();
  }
}