Java集合原始碼分析06----Stack原始碼分析
阿新 • • 發佈:2018-12-19
目錄
簡介
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(); } }