天天看点

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;
}
           

结束

继续阅读