栈数据结构的主要特性是Last in first out (LIFO);每次新增元素的操作都是放在栈顶,取数据操作都是获取栈顶第一个元素。
简单的看源码我们会发现一个特别有意思的事情
public
class Stack<E> extends Vector<E> {
/**
* Creates an empty Stack.
*/
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;
}
}
Stack是继承的Vector类,之前我们看Vector的时候看到Vector的功能类似与线程安全的ArrayList。但是Vector提供了顺序访问和随机访问两种方式,明显不符合我们栈数据结构的操作要求,所以Vector提供了扩展的方法帮我们实现LIFO
两个方法 Push()/Pop();
push方法向栈顶押入数据
pop方法从栈顶取出数据,并删除栈顶的数据
还有peek方法是只获取栈顶原素,并不删除栈顶的数据
Stack类注释里面有一段话需要注意
A more complete and consistent set of LIFO stack operations is
* provided by the Deque interface and its implementations, which
* should be used in preference to this class. For example: Deque<Integer> stack = new ArrayDeque<Integer>();
Deque有更完善的栈操作实现,如果Stack不满足大家的开发任务,大家可以尝试使用Deque来替代Stack类型