JDK源码

java.util.Stack源码解析

2018-02-27  本文已影响0人  sunpy

准备知识

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版本的

上一篇下一篇

猜你喜欢

热点阅读