Stack源码分析

Stack类图

Stack是java.util包下List接口下的一个集合子类,是一个栈,线程安全的。底层是通过继承Vector实现的。

  • AbstractList抽象类:List的抽象父类,实现一些List通用的方法。
  • Cloneable接口:实现对象拷贝必须要实现的接口。
  • Serializable接口:实现序列化必须要实现的接口。
  • RandomAccess接口:用于定义数组实现随机访问的算法,ArrayList和Vector都实现了该接口。

Stack类属性

Stack内部只定义了一个序列化ID,其余属性都是继承自Vector。

Vector源码分析链接:https://blog.csdn.net/qq_42191317/article/details/96752763

Stack常用API

    public Stack() {
    }

构造方法:空参,什么也没有处理,实例化的时候,父类的构造器也会实例化。

    public E push(E item) {
        addElement(item);

        return item;
    }

    public synchronized void addElement(E obj) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = obj;
    }

push方法:入栈一个元素,调用Vector的add方法实现,往数组末尾增加一个元素,时间复杂度O(1)

    public synchronized E peek() {
        int     len = size();

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

peek方法:查看当前栈顶元素,即数组的头部元素,调用Vector的elementAt方法,根据下标访问,时间复杂度O(1)

    public synchronized E pop() {
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }

pop方法:出栈一个元素,调用Vector的removeElementAt方法,根据下标删除元素,由于栈后进先出的特性,每次删除的都是末尾元素,时间复杂度O(1)

    public boolean empty() {
        return size() == 0;
    }

empty方法:判空方法,判断数组当前元素个数是否为0

    public synchronized int search(Object o) {
        int i = lastIndexOf(o);

        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }

search方法:搜索某个元素是否存在,存在返回下标,不存在返回-1,如果存在多个,返回最后压入的那个

总结

  • Stack是一个栈结构,继承自Vector,线程安全的。
  • 入栈、出栈时间复杂度都是O(1),查找某个元素时间复杂度O(n)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值