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進去元素第一個被取出來
    }

    這裏面的源碼好像都不很複雜,就不多說了!最後說一句就是看源碼時建議先可以看看父類裏面的方法

 

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