zoukankan      html  css  js  c++  java
  • Java Stack源码分析

    Stack简介

      Stack是栈。它的特性是:先进后出(FILO, First In Last Out)。java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表。当然,我们也可以将LinkedList当作栈来使用。Stack的继承关系

    java.lang.Object
    ↳     java.util.AbstractCollection<E>
       ↳     java.util.AbstractList<E>
           ↳     java.util.Vector<E>
               ↳     java.util.Stack<E>
    
    public class Stack<E> extends Vector<E> {}
    

      Stack和Collection的关系如下图:https://images0.cnblogs.com/blog/497634/201309/08213747-6f2f69ba19e9485f9f6ae8c17f0f253b.jpgStack源码解析(基于JDK1.6.0_45)

    package java.util;
    
    public
    class Stack<E> extends Vector<E> {
        // 版本ID。这个用于版本升级控制,这里不须理会!
        private static final long serialVersionUID = 1224463164541339165L;
    
        // 构造函数
        public Stack() {
        }
    
        // push函数:将元素存入栈顶
        public E push(E item) {
            // 将元素存入栈顶。
            // addElement()的实现在Vector.java中
            addElement(item);
            return item;
        }
    
        // pop函数:返回栈顶元素,并将其从栈中删除
        public synchronized E pop() {
            E   obj;
            int  len = size();
            obj = peek();
            // 删除栈顶元素,removeElementAt()的实现在Vector.java中
            removeElementAt(len - 1);
            return obj;
        }
    
        // peek函数:返回栈顶元素,不执行删除操作
        public synchronized E peek() {
            int  len = size();
            if (len == 0)
                throw new EmptyStackException();
            // 返回栈顶元素,elementAt()具体实现在Vector.java中
            return elementAt(len - 1);
        }
    
        // 栈是否为空
        public boolean empty() {
            return size() == 0;
        }
    
        // 查找“元素o”在栈中的位置:由栈底向栈顶方向数
        public synchronized int search(Object o) {
            // 获取元素索引,elementAt()具体实现在Vector.java中
            int i = lastIndexOf(o);
            if (i >= 0) {
                return size() - i;
            }
            return -1;
        }
    }
    View Code

       总结:

    1. Stack实际上也是通过数组去实现的。执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。执行pop时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。
    2. Stack继承于Vector,意味着Vector拥有的属性和功能,Stack都拥有。
  • 相关阅读:
    设计模式小结
    Asp.net 中HttpHandler,HttpModule,IHttpHandlerFactory的原理与应用(一)
    全新对待.net一次全面的旅程
    页面生命周期小结
    面向对象点滴
    Chapter 2.1:WCF服务契约的重载与继承详解
    一封给“X教授”的回信(讨论Socket通信)
    Chapter 1.4:WCF实践 元数据详解
    有了WCF,Socket是否已人老珠黄?
    Chapter 1.3:WCF实践 HelloWorld
  • 原文地址:https://www.cnblogs.com/wxgblogs/p/5689497.html
Copyright © 2011-2022 走看看