美文网首页JDK源码
java.util.Stack源码解析

java.util.Stack源码解析

作者: sunpy | 来源:发表于2018-02-27 21:26 被阅读0次

    准备知识

    Stack类采用的是动态数组栈实现的,规则后进先出,从栈顶压入元素、从栈顶弹出元素。栈实际上是一种添加了后进先出规则的顺序表。Stack类是在Vector类的基础上进行继承并扩展功能。
    https://www.jianshu.com/p/532a6e161112

    所属包

    package java.util;
    

    继承与实现关系

    public  
    class Stack<E> extends Vector<E>
    

    构造方法

        /**  
         * 创建一个栈的空构造方法  
         */  
        public Stack() {  
        }  
    

    方法

    push方法,将元素压入栈

        /**  
         * 将元素item压入栈中  
         */  
        public E push(E item) {  
            addElement(item);  
      
            return item;  
        }  
          
        public synchronized void addElement(E obj) {  
            modCount++;  
            //进行扩容操作  
            /**    
                * 增加此向量的容量(如有必要),以确保其至少能够保存最小容量参数指定的组件数。    
                * 如果当前数组的容量小于minCapacity,那么就增加容量,增加数组长度    
                * 新数组的长度等于原数组的长度加上增量capacityIncrement。    
                * 如果增加capacityIncrement小于等于0,那么就自动扩增为原来二倍。    
                * 如果扩增为原来的二倍还是比minCapacity小,那么就将minCapacity作为Object数组的长度。    
                   */   
            ensureCapacityHelper(elementCount + 1);  
            //在栈顶插入元素  
            elementData[elementCount++] = obj;  
        }  
    

    pop方法,从栈顶弹出元素,并且在栈中将该元素删除

       /**  
        * 从栈顶弹出元素  
        */  
       public synchronized E pop() {  
           E       obj;  
           int     len = size();  
        //获取栈顶元素,但是不弹出元素  
           obj = peek();  
        //删除该栈顶元素  
           removeElementAt(len - 1);  
      
           return obj;  
       }  
    

    peek方法,从栈中取出元素值,但是不删除栈中的值

       /**  
        * 获取下标为数组长度减一也就是最后的值,也符合栈的规则,从栈顶弹出元素  
        */  
       public synchronized E peek() {  
           int     len = size();  
          
           if (len == 0)  
               throw new EmptyStackException();  
           return elementAt(len - 1);  
       }  
       
      public synchronized E elementAt(int index) {  
              if (index >= elementCount) {  
                   throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);  
              }  
      
              return elementData(index);  
           }  
      
           //通过索引来获取数组中对应的值  
    E elementData(int index) {  
           return (E) elementData[index];  
       }  
    

    阅读总结

    (1)Stack动态栈是线程安全的。
    (2)Stack是基于Vector动态数组结构实现的,只是控制进出元素的方式为后进先出的栈方式。


    ---------------------------该源码为jdk1.7版本的

    相关文章

      网友评论

        本文标题:java.util.Stack源码解析

        本文链接:https://www.haomeiwen.com/subject/wfqvxftx.html