java集合系列——List集合之Stack介绍(五)「建议收藏」

Stack的简介Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。

大家好,又见面了,我是全栈君。

1.Stack的简介

Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。
因为它继承自Vector,那么它的实现原理是以数组实现堆栈的。如果要以链表方式实现堆栈可以使用LinkedList!

2.Stack的继承关系

java.lang.Object
  继承者 java.util.AbstractCollection<E>
      继承者 java.util.AbstractList<E>
          继承者 java.util.Vector<E>
              继承者 java.util.Stack<E>
所有已实现的接口:
Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess

并且从类 java.util.Vector 继承的字段

capacityIncrement, elementCount, elementData 

从类 java.util.AbstractList 继承的字段

modCount

3.Stack的API
Stack API

Stack只有下面四个方法!由于Stack继承了Vector ,它也有Vector的API方法!

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

4.源码

public
class Stack<E> extends Vector<E> { 
   
    /** * 创建一个空堆栈。 */
    public Stack() {
    }

    /** * 把项压入堆栈顶部。其作用与下面的方法完全相同: * * item - 压入堆栈的项。 * * @return 返回 item 参数。 */
    public E push(E item) {
        addElement(item);//是Vector中的方法,详细实现请查看Vector的源码

        return item;
    }

    /** * 移除堆栈顶部的对象,并作为此函数的值返回该对象。 * * @return 堆栈顶部的对象( Vector 对象中的最后一项)。 * @throws EmptyStackException if this stack is empty. */
    public synchronized E pop() {
  
  //注意此方法是 synchronized修饰的,同步方法
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);//是Vector中的方法,详细实现请查看Vector的源码

        return obj;
    }

    /** * 查看堆栈顶部的对象,但不从堆栈中移除它。 * */
    public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }

    /** * Tests if this stack is empty. * * 测试堆栈是否为空。 为空返回 true */
    public boolean empty() {
        return size() == 0;
    }

    /** * 返回对象在堆栈中的位置,以 1 为基数。如果对象 o是堆栈中的一个项, * 此方法返回距堆栈顶部最近的出现位置到堆栈顶部的距离; * 堆栈中最顶部项的距离为 1。使用 equals 方法比较 o 与堆栈中的项。 * * @param o the desired object. o - 目标对象。 * @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. * 返回 : 对象到堆栈顶部的位置,以 1 为基数;返回值 -1 表示此对象不在堆栈中。 */
    public synchronized int search(Object o) {
  
  //注意此方法为 synchronized
        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;
}

5.总结

(1) Stack实际上也是通过数组去实现的。实际调用的实现方法都是Vector中的方法!
– push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。

  • peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。

  • pop时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。

(2) Stack继承于Vector,Stack拥有着Vector的属性和功能!


java集合系列——java集合概述(一)
java集合系列——List集合之ArrayList介绍(二)
java集合系列——List集合之LinkedList介绍(三)
java集合系列——List集合之Vector介绍(四)
java集合系列——List集合之Stack介绍(五)
java集合系列——List集合总结(六)
java集合系列——Map介绍(七)
java集合系列——Map之HashMap介绍(八)
java集合系列——Map之TreeMap介绍(九)
java集合系列——Set之HashSet和TreeSet介绍(十)



如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!
祝你今天开心愉快!


欢迎访问我的csdn博客,我们一同成长!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

博客首页http://blog.csdn.net/u010648555

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121184.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python to exe transporter: py2exe Test report「建议收藏」

    python to exe transporter: py2exe Test report「建议收藏」pipinstallpy2exefromdistutils.coreimportsetupimportpy2exesetup(windows=[{“script”:”123.py”}])Thisreportisonlyusedtorecord.

    2022年9月11日
    0
  • ajax请求五个步骤!

    ajax请求五个步骤!ajax请求五个步骤!今天咱们讲一讲Ajax请求五个步骤!1.创建XMLHttpRequest异步对象varxhr;if(window.XMLHttpRequest){//codeforIE7+,Firefox,Chrome,Opera,Safarixhr=newXMLHttpRequest();}else{//codeforIE6,IE5xhr=newActiveXObject(“Microsoft.XMLHTTP”);}2

    2022年5月13日
    123
  • java interface接口和多继承[通俗易懂]

    java interface接口和多继承[通俗易懂]很长时间不能很好解释多继承,今天看到一个特别好的解释,大快! 以下是引用:我认为你好像是不明白接口怎么用?也就是不明白为什么要定义那么多接口然后再用类去一个个继承他们。我跟你举个游戏的例子吧:这里有一个游戏,人猿泰山。主角是一个单独的类,这里我们主要用怪物说明接口的用法:怪物有很多种,按地域分:有的在天上飞,有的在地上跑,有的在水里游按攻击方式分:有的能近距离物理攻击,有的能

    2022年7月16日
    14
  • spring 注解验证@NotNull等使用方法「建议收藏」

    spring 注解验证@NotNull等使用方法「建议收藏」常用标签@Null被注释的元素必须为null@NotNull被注释的元素不能为null@AssertTrue被注释的元素必须为true@AssertFalse被注释的元素必须为false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(

    2022年6月13日
    32
  • python进阶(13)装饰器[通俗易懂]

    python进阶(13)装饰器[通俗易懂]装饰器装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上。和这个函数绑定在一起。在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,

    2022年7月31日
    3
  • python button使用方法_python gui界面设计

    python button使用方法_python gui界面设计Button控件是一种标准Tkinter控件,用来展现不同样式的按钮.Button控件被用以和用户交互,比如按钮被鼠标点击后,某种操作被启动.和Label控件类似,按钮可以展示图片或者文字.不同的是,Label控件可以指定字体,Button控件只能使用单一的字体.Button上的文字可以多行显示.可以将一个Python函数或方法绑定到一个B

    2022年8月30日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号