Stack源碼解析(JDK1.7)
摸魚摸魚~!
Stack的層次關系圖
從層次圖中看到… 所有的接口都在以前的博文中介紹過了… 這裡還沒有解析過的是 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;
}