目录
简介
Stack模拟的是栈的操作,继承了Vector类,底层也是通过数组来实现的。栈的数据特点是先进后出(FILO,First In Last Out),即最后压入栈的元素,总是第一个弹出栈。由于Stack继承了Vector,所以线程安全,并且提供了操作队列的方法,可以随机访问,能克隆,能进行序列化和序列化传输。
介绍
1.构造方法
public Stack() {}
- 构建一个空的Stack.
2.内部方法
public E push(E item){}
public synchronized E pop() {}
public synchronized E peek() {}
public boolean empty() {}
public synchronized int search(Object o) {}
- push(E item)----向栈顶压入一个元素。
- pop()----返回栈顶的元素,并从栈里面移除。如果栈为空,将抛出EmptyStackException异常。
- peek()----返回栈顶的元素,不执行删除操作。如果栈为空,将抛出EmptyStackException异常。
- empty()----如果栈为空,返回true。
- search(object o)----查找栈顶元素在栈中位置,返回元素到栈顶部的距离。
源码分析(基于jdk1.8)
public class Stack<E> extends Vector<E> {
//创建空的Stack实例
public Stack() {
}
//向栈顶压入一个指定元素,底层调用的addElement()方法,并返回存入的元素。
public E push(E item) {
addElement(item);
return item;
}
//返回栈顶的元素,并从栈中移除。
//如果栈为空,将抛出EmptyStackException异常
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
//移除最后一个元素。
removeElementAt(len - 1);
return obj;
}
//返回栈顶的元素,不执行移除操作。
//如果栈为空,将抛出EmptyStackException异常
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
//返回最后一个元素
return elementAt(len - 1);
}
//如果栈为空,返回true。
public boolean empty() {
return size() == 0;
}
//查找栈中指定元素,返回元素到栈顶部的距离。
public synchronized int search(Object o) {
//返回栈中最后出现指定元素的位置。
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
/** use serialVersionUID from JDK 1.0.2 for interoperability */
//序列化版本号
private static final long serialVersionUID = 1224463164541339165L;
}
案例
Stack继承了Vector,所以拥有Stack的大部分方法,这里测试了栈的访问。
public class StackDemo {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
for(String word:"this is a demo about stack".split(" ")) {
stack.push(word);
}
System.out.println("peek----"+stack.peek());
while(!stack.isEmpty()) {
System.out.print(stack.pop()+" ");
}
System.out.println();
}
}
运行结果:
peek----stack
stack about demo a is this
可以看出先进栈的元素,后弹出栈。