1.Stack源码解析
1.1概述
Stack是Vector的子类,也是一个线程安全的容器,从名字上可以看出,其是一个栈
结构。
//继承Vector
public class Stack<E> extends Vector<E> {
1.2构造器
/*
* Stack只有一个空参构造器,
* 因为继承,默认会调用父类的空参构造器,所以
* 会调用Vector的空参构造器,由[Vector源码解析]可以
* 知道,Vector的空参构造器默认会初始化一个长度为10的数组。
*/
public Stack() {
}
1.3常用方法
1.3.1push()
public E push(E item) {
/*
* 此方法是其父类Vector的方法,是在数组尾部(第一个空位置)添加元素
* 详细讲解参考Vector源码解析
*/
addElement(item);
return item;
}
1.3.2pop()
/*
* 同步方法,将队尾元素删除(弹出栈顶元素)并返回
*/
public synchronized E pop() {
E obj;
//获取元素个数
int len = size();
//获取尾部(栈顶)元素
obj = peek();
//删除栈顶元素
removeElementAt(len - 1);
//返回栈顶元素
return obj;
}
removeElementAt
public synchronized void removeElementAt(int index) {
modCount++;
//判断索引是否合法
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
//求出index位置的后面的元素个数(不包括index位置的元素)
int j = elementCount - index - 1;
//将index位置后面的元素往前移动一位
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j);
}
//元素个数减1
elementCount--;
//最后一个元素置为NULL。
elementData[elementCount] = null;
}
1.3.3peek()
/*
* 同步方法,查看栈顶元素。
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
//返回栈顶元素
return elementAt(len - 1);
}
1.4总结
本质上还是一个集合,只是定义了在数组一端进行插入和删除的操作,所以可以作为栈使用。但是由于其核心方法都是加了锁了,所以效率比较低,一般使用LinkedList或者ArrayDeque代替Stack使用。