zoukankan      html  css  js  c++  java
  • java.util.Stack类简介

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

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

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

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

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

    1. public class Stack<E> extends Vector<E> {  
    2. /** 
    •     * 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(" ");  
      •     }  
        • 结果:
          • ------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方法说明)

     

  • 相关阅读:
    go函数和方法
    Golang的“面向对象”
    高性能 socket 框架
    wpf 自定义圆形按钮
    WPF 实际国际化多语言界面
    使用过滤器对mvc api接口安全加密
    使用mvc3实现ajax跨域
    WPF,给颜色SolidColorBrush添加动画
    C# 通用验证类 支持 WPF,MVC,Winform
    WSL安装ubuntu搭建vue开发环境(三):docker安装
  • 原文地址:https://www.cnblogs.com/lifei66/p/7978220.html
Copyright © 2011-2022 走看看