探索Stack底层实现

简单介绍

Stack类就一百多行代码,简单说明下。它的特性是后进先出(LIFO),继承了Vector类,大部分的操作都是使用Vector中的方法。在注释中,作者提醒我们若要使用后进先出的栈操作,应该优先使用Deque,这么说来,该类已经被放弃了,早在JDK1.0的时候它就出现了,是有点老了!我们说过Vector属于相对线程安全,所以Stack也是相对线程安全!探索Stack源代码是基于JDK1.8的。

源码

该类的代码不多,就不做分类了,不过为了方便理解,提供了它的数据结构图。

Stack数据结构图

说是后进先出,实际上它还是能通过调用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 严格上说并不满足后进先出原则

posted @ 2020-12-21 20:44  zliawk  阅读(210)  评论(0)    收藏  举报