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