Stack源码简单剖析

 boolean empty() 
          测试堆栈是否为空。 
 E peek() 
          查看堆栈顶部的对象,但不从堆栈中移除它。 
 E pop() 
          移除堆栈顶部的对象,并作为此函数的值返回该对象。 
 E push(E item) 
          把项压入堆栈顶部。 
 int search(Object o) 
          返回对象在堆栈中的位置,以 1 为基数。 

 ----------------------------------------------------------

 	protected Object[] elementData;

  // 关于stack源码简单剖析,其实想要看Stack的源码,首先可以先看看他的Vector的源码,因为Stack好多方法都是继承Vector过来的,下面简单看几个方法
  
  // 首先是push方法,也就是压栈方法,其实这个push方法底层的实现跟集合相差无几;第一步也是添加一个元素进来的时候,对当前的元素个数进行+1,然后下面一些关联的方法对Count个数和元素的长度进行了一系列的
  // 比较,大概可以减少长度不满足的时候,进行扩容的操作(这里面大部分方法都是继承它的父类的);扩容之后再把elementData进行返回
   public E push(E item) {
        addElement(item);

        return item;
    }

    public synchronized void addElement(E obj) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = obj; // 添加的元素赋值到对应的索引位置上
    }

      private void ensureCapacityHelper(int minCapacity) {
        // 其实这个方法只是把当前元素的个数跟元素的长度进行了下对比
        if (minCapacity - elementData.length > 0) // 大于,下面进行扩容操作
            grow(minCapacity);
    }


      private void grow(int minCapacity) {
        // 这里离是把这个元素的长度赋值给了一个新的变量,这样做的好处也是为了让其他操作不影响接下来这个方法后面的操作(如果不新建一个变量的话,这个元素的长度可能会随时变化)
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity); // original - 要复制的数组 newLength - 要返回的副本的长度 

    }

     	private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }


    // 查看栈顶对象,也就是最后添加的元素(栈先进后出)
    public synchronized E peek() {
    
    	/**
    	 * 		第一步就是获取这个Stack的的长度,size也就是元素的个数
    	 *      public synchronized int size() {
		 *	        return elementCount;
		 *	    }
    	 */
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1); // 获取最大索引,因为索引是0开始所以需要进行-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]; // 取出最大索引进行返回,那么后push进去元素第一个被取出来
    }

    这里面的源码好像都不很复杂,就不多说了!最后说一句就是看源码时建议先可以看看父类里面的方法

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章