Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来
Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用,Stack本身通过扩展Vector而来,而Vector本身是一个可增长的对象数组( a growable array of objects)那么这个数组的哪里作为Stack的栈顶,哪里作为Stack的栈底?
查看Stack源码:
//Stack
public class Stack extends Vector { public Stack() { } //推obj入栈 public Object push(Object obj) { addElement(obj); return obj; } //返回栈顶数据,并移除 public synchronized Object pop() { int i = size(); Object obj = peek(); removeElementAt(i - 1); return obj; } //返回栈顶数据,不移除 public synchronized Object peek() { int i = size(); if(i == 0) throw new EmptyStackException(); else return elementAt(i - 1); } //是否为空 public boolean empty() { return size() == 0; } //返回离栈顶最近的obj的位置,不存在返回-1 public synchronized int search(Object obj) { int i = lastIndexOf(obj); if(i >= 0) return size() - i; else return -1; } private static final long serialVersionUID = 1224463164541339165L; }
结构:
测试:
package test; import java.util.Stack; public class testStack { public static void main(String[] args) { Stack<String> ts = new Stack<String>(); System.out.println("======is empty:"+ts.empty()); ts.push("1"); ts.push("5"); ts.push("2"); ts.push("3"); ts.push("2"); ts.push("4"); System.out.println("======peek:"+ts.peek()); System.out.println("======size after peek:"+ts.size()); System.out.println("======search not exists:"+ts.search(2)); System.out.println("======search exists:"+ts.search("2")); System.out.println("======peek:"+ts.pop()); System.out.println("======size after pop:"+ts.size()); } }
结果:
======is empty:true
======peek:4
======size after peek:6
======search not exists:-1
======search exists:2
======peek:4
======size after pop:5