java.util.Stack类简介
来源:互联网 发布:网络炭化植物 编辑:程序博客网 时间:2024/06/06 02:04
Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来
Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用
E push(E item) 把项压入堆栈顶部。 E pop() 移除堆栈顶部的对象,并作为此函数的值返回该对象。 E peek() 查看堆栈顶部的对象,但不从堆栈中移除它。 boolean empty() 测试堆栈是否为空。 int search(Object o) 返回对象在堆栈中的位置,以 1 为基数。
Stack本身通过扩展Vector而来,而Vector本身是一个可增长的对象数组( a growable array of objects)那么这个数组的哪里作为Stack的栈顶,哪里作为Stack的栈底?
答案只能从源代码中寻找,jdk1.6:
public class Stack<E> extends Vector<E> { /** * Creates an empty Stack. */ public Stack() { } /** * Pushes an item onto the top of this stack. This has exactly * the same effect as: * <blockquote><pre> * addElement(item)</pre></blockquote> * * @param item the item to be pushed onto this stack. * @return the <code>item</code> argument. * @see java.util.Vector#addElement */ public E push(E item) {addElement(item);return item; } /** * Removes the object at the top of this stack and returns that * object as the value of this function. * * @return The object at the top of this stack (the last item * of the <tt>Vector</tt> object). * @exception EmptyStackException if this stack is empty. */ public synchronized E pop() {Eobj;intlen = size();obj = peek();removeElementAt(len - 1);return obj; } /** * Looks at the object at the top of this stack without removing it * from the stack. * * @return the object at the top of this stack (the last item * of the <tt>Vector</tt> object). * @exception EmptyStackException if this stack is empty. */ public synchronized E peek() {intlen = size();if (len == 0) throw new EmptyStackException();return elementAt(len - 1); } /** * Tests if this stack is empty. * * @return <code>true</code> if and only if this stack contains * no items; <code>false</code> otherwise. */ public boolean empty() {return size() == 0; } /** * Returns the 1-based position where an object is on this stack. * If the object <tt>o</tt> occurs as an item in this stack, this * method returns the distance from the top of the stack of the * occurrence nearest the top of the stack; the topmost item on the * stack is considered to be at distance <tt>1</tt>. The <tt>equals</tt> * method is used to compare <tt>o</tt> to the * items in this stack. * * @param o the desired object. * @return the 1-based position from the top of the stack where * the object is located; the return value <code>-1</code> * indicates that the object is not on the stack. */ 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;}
通过peek()方法注释The object at the top of this stack (the last item of the Vector object,可以发现数组(Vector)的最后一位即为Stack的栈顶
pop、peek以及search方法本身进行了同步
push方法调用了父类的addElement方法
empty方法调用了父类的size方法
Vector类为线程安全类
综上,Stack类为线程安全类(多个方法调用而产生的数据不一致问题属于原子性问题的范畴)
public class Test {public static void main(String[] args) {Stack<String> s = new Stack<String>();System.out.println("------isEmpty");System.out.println(s.isEmpty());System.out.println("------push");s.push("1");s.push("2");s.push("3");Test.it(s);System.out.println("------pop");String str = s.pop();System.out.println(str);Test.it(s);System.out.println("------peek");str = s.peek();System.out.println(str);Test.it(s);System.out.println("------search");int i = s.search("2");System.out.println(i);i = s.search("1");System.out.println(i);i = s.search("none");System.out.println(i);}public static void it(Stack<String> s){System.out.print("iterator:");Iterator<String> it = s.iterator();while(it.hasNext()){System.out.print(it.next()+";");}System.out.print("\n");}}
结果:
------isEmptytrue ------pushiterator:1;2;3; ------pop3--栈顶是数组最后一个iterator:1;2;------peek2--pop取后删掉,peek只取不删iterator:1;2;------search 1--以1为基数,即栈顶为12--和栈顶见的距离为2-1=1-1--不存在于栈中
Stack并不要求其中保存数据的唯一性,当Stack中有多个相同的item时,调用search方法,只返回与查找对象equal并且离栈顶最近的item与栈顶间距离(见源码中search方法说明)
- java.util.Stack类简介
- java.util.Stack类简介
- java.util.Stack类简介
- java.util.Stack类简介
- java.util.Stack类简介
- java.util.Stack类简介
- java.util.Stack类简介(版本1.6--empty方法)
- java.util.Stack的用法及简介
- 【java】java.util.Stack类
- Java.util.Stack类的peek()方法
- Java.util.Stack类的peek()方法
- java.util.Stack翻译
- java.util.Stack
- java.util.Stack
- java.util.Stack
- java.util.Scanner类简介
- java 栈----java.util.Stack
- java.util.Stack创建栈
- Visitor
- Android中ListView异步加载数据
- 一个自动更新小程序
- VisitorSupport
- android 插件开发总结
- java.util.Stack类简介
- jstl的foreach循环整数
- 理解inode
- 静态循环队列的相关操作及详解
- haar.cpp sourcearchive
- Sentry Robots 组队赛第二场 Regionals 2012, Europe - Southwestern F题
- win7 android 环境搭建---简洁版本
- HDU1250:Hat's Fibonacci
- apache-实战FastCGI