天天看點

Stack源碼解析(JDK1.7)

Stack源碼解析(JDK1.7)

摸魚摸魚~!
Stack的層次關系圖
Stack源碼解析(JDK1.7)
從層次圖中看到… 所有的接口都在以前的博文中介紹過了… 這裡還沒有解析過的是 Vector (線程安全的清單類)
Vector

我粗略的讀了一下…

實作的方式幾乎和 ArrayList 一模一樣… 就是每個方法進行加鎖…

這裡就簡單的把一些不一樣的地方,有些重要的地方拿出來看一下…

構造方法 上

//構造方法中... 
//預設也是使用10作為預設容量... 不過 有點不一樣的是
//ArrayList 中使用的 是 1.5倍的擴容.. 這裡确實可以指定一個擴容的數量進行擴容..
//稍微細緻一點... 這邊是先進行執行個體化存儲單元的... 底層也是使用一個數組進行存儲的..
public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
}
           

擴容機制

從執行個體方法中發現… 了擴容機制可能不太一樣… 直接瞄上擴容機制… 發現确實有蹊跷

結論: 在沒有指定 一個增長容量的參數時候 會擴容到原來的2倍 不是arrayList的1.5倍!

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    // 不指定的時候 capcityIncrement 為 0 
    // so 2倍!
    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);
}
           

簡單介紹了一下 Vector之後…Statck的源碼 就很簡單了- -…幾乎都是使用的Vector的方法…

Stack

// 這裡就是代碼的全部了…就這麼點東西- - …

注意 ! Stack 是線程安全的!
public
class Stack<E> extends Vector<E> {
    public Stack() {} 
    public E push(E item) {
        addElement(item);
        return item;
    }
    public synchronized E pop() {
        E       obj;
        int     len = size();
        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }
    public synchronized E peek() {
        int     len = size();
        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }
    public boolean empty() {
        return size() == 0;
    }
    public synchronized int search(Object o) {	//這個方法還别緻的...沒用過
        int i = lastIndexOf(o);
        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }
    private static final long serialVersionUID = 1224463164541339165L;
}
           

結束

繼續閱讀