【JDK源码剖析】Stack -- 栈

该博客主要对Java的Stack类进行源码解析。Stack类代表后进先出堆栈对象,扩展自Vector。文中介绍了Stack类的静态字段、构造方法和普通方法,包括添加、删除元素,判断是否为空及查找元素位置等,还提及相关方法多继承自Vector。

概述

Stack类代表后进先出(LIFO, last-in-first-out)堆栈的对象。 它扩展了Vector,允许一个向量被视为堆栈。

提供了push和pop操作,还有测试堆栈是否为empty的方法,以及通过search对象,找到该对象在此堆栈上的基于栈底的位置。

我们下面会对Stack源码进行解析

public class Stack<E> extends Vector<E>

Stack<E> 继承了Vector<E>, 按道理说应该先介绍一下Vector集合框架的源码, .

但是如果Vector和Stack放在一起说的话 , 会显得很冗余 , 之后的源码剖析的类也很有可能继承自vector , 今后肯定会专门写博文好好介绍一下集合框架这个大家族,所以这里不再对vector有很专门的介绍了 。

Stack类

Stack的类图
在这里插入图片描述

静态字段

这个与序列化有关

 private static final long serialVersionUID = 1224463164541339165L;

构造方法

  //创建一个空栈
    public Stack() {
  	}

刚初始化的时候 因为继承自Vector的缘故,该动态数组的默认大小为 10:

普通方法

添加元素

 //添加元素 返回值是添加的元素
    public E push(E item) {
        addElement(item);
        return item;
    }

addElement这个方法继承自Vector 添加一个元素

删除元素

//线程安全  删除栈顶元素 并返回该栈顶元素
    public synchronized E pop() {
        E       obj;
        int     len = size();

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

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

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

removeElementAt 与 elementAt均继承自vector

size()继承vector 值为vector的元素个数
这段源码来自Vector

    public synchronized int size() {
        return elementCount;
    }
判断是否为空
    public boolean empty() {
        return size() == 0;
    }
查找指定元素的位置

这里加锁 是线程安全的

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

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

lastIndexOf也是继承自Vector
代码逻辑简单不妨在这里看一下

   public synchronized int lastIndexOf(Object o) {
        return lastIndexOf(o, elementCount-1);//elementCount为元素数量
    }
    
    public synchronized int lastIndexOf(Object o, int index) {
        if (index >= elementCount)
            throw new IndexOutOfBoundsException(index + " >= "+ elementCount);

        if (o == null) {
            for (int i = index; i >= 0; i--)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index; i >= 0; i--)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

API起到很好的总结作用呀
在这里插入图片描述
外加一个size() 标识元素个数 通过Stack,以后栈的使用就能为所欲为了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值