java.util.Stack類簡介
阿新 • • 發佈:2017-12-04
ext 原子性 enc 唯一性 cti ber cto 性問題 ret
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() {
- E obj;
- int len = 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() {
- int len = 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");
- }
- }
- 結果:
-
- ------isEmpty
- true
- ------push
- iterator:1;2;3;
- ------pop
- 3 --棧頂是數組最後一個
- iterator:1;2;
- ------peek
- 2 --pop取後刪掉,peek只取不刪
- iterator:1;2;
- ------search
- 1 --以1為基數,即棧頂為1
- 2 --和棧頂見的距離為2-1=1
- -1 --不存在於棧中
-
Stack並不要求其中保存數據的唯一性,當Stack中有多個相同的item時,調用search方法,只返回與查找對象equal並且離棧頂最近的item與棧頂間距離(見源碼中search方法說明)
java.util.Stack類簡介