概述
Stack类代表后进先出(LIFO, last-in-first-out)堆栈的对象。 它扩展了Vector,允许一个向量被视为堆栈。
提供了push和pop操作,还有测试堆栈是否为empty的方法,以及通过search对象,找到该对象在此堆栈上的基于栈底的位置。
我们下面会对Stack源码进行解析
public class Stack<E> extends Vector<E>
Stack<E> 继承了Vector<E>, 按道理说应该先介绍一下Vector集合框架的源码, .
但是如果Vector和Stack放在一起说的话 , 会显得很冗余 , 之后的源码剖析的类也很有可能继承自vector , 今后肯定会专门写博文好好介绍一下集合框架这个大家族,所以这里不再对vector有很专门的介绍了 。
Stack类
Stack的类图

静态字段
这个与序列化有关
private static final long serialVersionUID = 1224463164541339165L;
构造方法
//创建一个空栈
public Stack() {
}
刚初始化的时候 因为继承自Vector的缘故,该动态数组的默认大小为 10:
普通方法
添加元素
//添加元素 返回值是添加的元素
public E push(E item) {
addElement(item);
return item;
}
addElement这个方法继承自Vector 添加一个元素
删除元素
//线程安全 删除栈顶元素 并返回该栈顶元素
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);
}
removeElementAt 与 elementAt均继承自vector
size()继承vector 值为vector的元素个数
这段源码来自Vector
public synchronized int size() {
return elementCount;
}
判断是否为空
public boolean empty() {
return size() == 0;
}
查找指定元素的位置
这里加锁 是线程安全的
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
lastIndexOf也是继承自Vector
代码逻辑简单不妨在这里看一下
public synchronized int lastIndexOf(Object o) {
return lastIndexOf(o, elementCount-1);//elementCount为元素数量
}
public synchronized int lastIndexOf(Object o, int index) {
if (index >= elementCount)
throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
if (o == null) {
for (int i = index; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = index; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
API起到很好的总结作用呀

外加一个size() 标识元素个数 通过Stack,以后栈的使用就能为所欲为了
该博客主要对Java的Stack类进行源码解析。Stack类代表后进先出堆栈对象,扩展自Vector。文中介绍了Stack类的静态字段、构造方法和普通方法,包括添加、删除元素,判断是否为空及查找元素位置等,还提及相关方法多继承自Vector。
575

被折叠的 条评论
为什么被折叠?



