1. 程式人生 > 實用技巧 >探索Stack底層實現

探索Stack底層實現

簡單介紹

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 嚴格上說並不滿足後進先出原則