探索Stack底層實現
阿新 • • 發佈:2020-12-21
簡單介紹
Stack
類就一百多行程式碼,簡單說明下。它的特性是後進先出(LIFO)
,繼承了Vector類,大部分的操作都是使用Vector中的方法。在註釋中,作者提醒我們若要使用後進先出的棧操作,應該優先使用Deque
,這麼說來,該類已經被放棄了,早在JDK1.0的時候它就出現了,是有點老了!我們說過Vector屬於相對執行緒安全,所以Stack也是相對執行緒安全!探索Stack
原始碼是基於JDK1.8
的。
原始碼
該類的程式碼不多,就不做分類了,不過為了方便理解,提供了它的資料結構圖。
說是後進先出,實際上它還是能通過呼叫Vector中的方法來破除該原則!該圖只是告訴大傢什麼是後進先出
。
public class Stack<E> extends Vector<E> { //初始化引數 public Stack() { } /** * 新增指定元素到棧的頂層 * @param item 指定元素 * @return 指定元素 */ public E push(E item) { addElement(item); return item; } /** * 移除棧的頂層元素 * @return 被移除的頂層元素 */ public synchronized E pop() { E obj; int len = size(); obj = peek(); removeElementAt(len - 1); return obj; } /** * 獲取棧的頂層元素 * 若為空陣列,則丟擲異常 */ public synchronized E peek() { int len = size(); if (len == 0) throw new EmptyStackException(); return elementAt(len - 1); } /** * 判斷陣列是否為空 * @return 陣列是否為空 */ public boolean empty() { return size() == 0; } /** * 反向遍歷獲取指定元素的索引,返回指定元素的索引與頂層元素的索引之間的差值 * 若未找到指定元素則返回-1 * @param o 指定元素 * @return 差值 */ public synchronized int search(Object o) { int i = lastIndexOf(o); if (i >= 0) { return size() - i; } return -1; } }
重點
使用Deque代替Stack
嚴格上說並不滿足後進先出原則