Stack是Vector的子类,也是一个线程安全的容器,从名字上可以看出,其是一个栈
结构。
//继承Vector public class Stack<E> extends Vector<E> {
/* * Stack只有一个空参构造器, * 因为继承,默认会调用父类的空参构造器,所以 * 会调用Vector的空参构造器,由[Vector源码解析]可以 * 知道,Vector的空参构造器默认会初始化一个长度为10的数组。 */ public Stack() { }
public E push(E item) { /* * 此方法是其父类Vector的方法,是在数组尾部(第一个空位置)添加元素 * 详细讲解参考Vector源码解析 */ addElement(item); return item; }
/* * 同步方法,将队尾元素删除(弹出栈顶元素)并返回 */ 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; }
/* * 同步方法,查看栈顶元素。 */ public synchronized E peek() { int len = size(); if (len == 0) throw new EmptyStackException(); //返回栈顶元素 return elementAt(len - 1); }
本质上还是一个集合,只是定义了在数组一端进行插入和删除的操作,所以可以作为栈使用。但是由于其核心方法都是加了锁了,所以效率比较低,一般使用LinkedList或者ArrayDeque代替Stack使用。