探索Stack底层实现
简单介绍
Stack类就一百多行代码,简单说明下。它的特性是后进先出(LIFO),继承了Vector类,大部分的操作都是使用Vector中的方法。在注释中,作者提醒我们若要使用后进先出的栈操作,应该优先使用Deque,这么说来,该类已经被放弃了,早在JDK1.0的时候它就出现了,是有点老了!我们说过Vector属于相对线程安全,所以Stack也是相对线程安全!探索Stack源代码是基于JDK1.8的。
源码
该类的代码不多,就不做分类了,不过为了方便理解,提供了它的数据结构图。

说是后进先出,实际上它还是能通过调用Vector中的方法来破除该原则!该图只是告诉大家什么是后进先出。
public class Stack<E> extends Vector<E> {
//初始化参数
public Stack() {
}
/**
* 添加指定元素到栈的顶层
* @param item 指定元素
* @return 指定元素
*/
public E push(E item) {
addElement(item);
return item;
}
/**
* 移除栈的顶层元素
* @return 被移除的顶层元素
*/
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);
}
/**
* 判断数组是否为空
* @return 数组是否为空
*/
public boolean empty() {
return size() == 0;
}
/**
* 反向遍历获取指定元素的索引,返回指定元素的索引与顶层元素的索引之间的差值
* 若未找到指定元素则返回-1
* @param o 指定元素
* @return 差值
*/
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
}
重点
使用Deque代替Stack 严格上说并不满足后进先出原则
浙公网安备 33010602011771号