java.util.Stack类简介(栈)

Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来

Deque(双端队列)比起stack具有更好的完整性和一致性,应该被优先使用

 1  E push(E item) 
 2           把项压入堆栈顶部。 
 3  E pop() 
 4           移除堆栈顶部的对象,并作为此函数的值返回该对象。 
 5  E peek() 
 6           查看堆栈顶部的对象,但不从堆栈中移除它。 
 7  boolean empty() 
 8           测试堆栈是否为空。  
 9  int search(Object o) 
10           返回对象在堆栈中的位置,以 1 为基数。

Stack本身通过扩展Vector而来,而Vector本身是一个可增长的对象数组( a growable array of objects)那么这个数组的哪里作为Stack的栈顶,哪里作为Stack的栈底?

答案只能从源代码中寻找,jdk1.6

 1 public class Stack<E> extends Vector<E> {
 2     /**
 3      * Creates an empty Stack.
 4      */
 5     public Stack() {
 6     }
 7 
 8     /**
 9      * Pushes an item onto the top of this stack. This has exactly
10      * the same effect as:
11      * <blockquote><pre>
12      * addElement(item)</pre></blockquote>
13      *
14      * @param   item   the item to be pushed onto this stack.
15      * @return  the <code>item</code> argument.
16      * @see     java.util.Vector#addElement
17      */
18     public E push(E item) {
19     addElement(item);
20 
21     return item;
22     }
23 
24     /**
25      * Removes the object at the top of this stack and returns that
26      * object as the value of this function.
27      *
28      * @return     The object at the top of this stack (the last item
29      *             of the <tt>Vector</tt> object).
30      * @exception  EmptyStackException  if this stack is empty.
31      */
32     public synchronized E pop() {
33     E    obj;
34     int    len = size();
35 
36     obj = peek();
37     removeElementAt(len - 1);
38 
39     return obj;
40     }
41 
42     /**
43      * Looks at the object at the top of this stack without removing it
44      * from the stack.
45      *
46      * @return     the object at the top of this stack (the last item
47      *             of the <tt>Vector</tt> object).
48      * @exception  EmptyStackException  if this stack is empty.
49      */
50     public synchronized E peek() {
51     int    len = size();
52 
53     if (len == 0)
54         throw new EmptyStackException();
55     return elementAt(len - 1);
56     }
57 
58     /**
59      * Tests if this stack is empty.
60      *
61      * @return  <code>true</code> if and only if this stack contains
62      *          no items; <code>false</code> otherwise.
63      */
64     public boolean empty() {
65     return size() == 0;
66     }
67 
68     /**
69      * Returns the 1-based position where an object is on this stack.
70      * If the object <tt>o</tt> occurs as an item in this stack, this
71      * method returns the distance from the top of the stack of the
72      * occurrence nearest the top of the stack; the topmost item on the
73      * stack is considered to be at distance <tt>1</tt>. The <tt>equals</tt>
74      * method is used to compare <tt>o</tt> to the
75      * items in this stack.
76      *
77      * @param   o   the desired object.
78      * @return  the 1-based position from the top of the stack where
79      *          the object is located; the return value <code>-1</code>
80      *          indicates that the object is not on the stack.
81      */
82     public synchronized int search(Object o) {
83     int i = lastIndexOf(o);
84 
85     if (i >= 0) {
86         return size() - i;
87     }
88     return -1;
89     }
90 
91     /** use serialVersionUID from JDK 1.0.2 for interoperability */
92     private static final long serialVersionUID = 1224463164541339165L;
93 }

通过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类为线程安全类(多个方法调用而产生的数据不一致问题属于原子性问题的范畴)

 1 public class StackTest {
 2     public static void main(String[] args) {
 3         Stack<String> s = new Stack<String>();
 4         System.out.println("------isEmpty");  
 5         System.out.println(s.isEmpty());  
 6         System.out.println("------push");  
 7         s.push("1");  
 8         s.push("2");  
 9         s.push("3");  
10         StackTest.t(s);  
11         System.out.println("------pop");  
12         String str = s.pop();  
13         System.out.println(str);  
14         StackTest.t(s);  
15         System.out.println("------peek");  
16         str = s.peek();  
17         System.out.println(str);  
18         StackTest.t(s);  
19         System.out.println("------search");  
20         int i = s.search("2");  
21         System.out.println(i);  
22         i = s.search("1");  
23         System.out.println(i);  
24         i = s.search("none");  
25         System.out.println(i); 
26     }
27     
28     public static void t(Stack<String> s){
29         System.out.println("iterator");
30         Iterator<String> it = s.iterator();
31         while(it.hasNext()){
32             System.out.print(it.next()+"    ");
33         }
34         System.out.println("
");
35     }
36 }

结果:

 1 ------isEmpty
 2 true          
 3 ------push
 4 iterator:1;2;3;  
 5 ------pop
 6 3        --栈顶是数组最后一个
 7 iterator:1;2;
 8 ------peek
 9 2        --pop取后删掉,peek只取不删
10 iterator:1;2;
11 ------search    
12 1        --以1为基数,即栈顶为1
13 2        --和栈顶见的距离为2-1=1
14 -1        --不存在于栈中

Stack并不要求其中保存数据的唯一性,当Stack中有多个相同的item时,调用search方法,只返回与查找对象equal并且离栈顶最近的item与栈顶间距离(见源码中search方法说明)

原文地址:https://www.cnblogs.com/wdpnodecodes/p/7406175.html