JAVA容器_java集合容器之Stack

这篇文章开始介绍Stack。从名字看他就是一个stack,因此具有数据结构中栈的一般特性(后进先出),平时用起来相对较多一点,但是也是非常简单。这篇文章我们将从源码的角度来分析一下Stack。

OK,开始今天的文章。

一、认识Stack

Stack继承自Vector。底层是通过数组实现的。下面我们认识一下Stack在整个java集合体系中的位置:

58ee3d6d55fbb2fb46476b9eb95a15a14723dce7.jpeg?token=d96895eac0c97b21256725a80c57ab4e&s=6B86EC0659CF40CA584D3C6802009073

我们会发现,其实Stack就是继承自Vector,因此它具有Vector的一般特点。我们把Stack放大,从Stack的角度来看一下:

8431d6aded73cadb1a0d3ce2bcb38774.png

从上图我们可以看到,Stack其实就是继承了Vector,Vector具有的接口的父类,Stack也有。

继承了AbstractList、实现了Enumeration、List、ListIterator等接口。

下面我们再来看一下源码,它的源码那是超级简单。

二、源码分析

一下源码基于jdk1.8来分析的。

(1)构造方法

publicStack(){}

只有一个无参构造方法。

(2)增加元素

72100b4aa850c46dc111d7aaaa7c67a4.png

这里面调用了addElement方法,我们追踪进去,继续往里看

59afc25c9f0e35f741a6979e6ebda8d5.png

synchronized 说明了这是一个线程安全的方法,他分了三步走的战略:

第一步:它在添加元素的时候首先将modCount加1,保证线程安全。第二步:ensureCapacityHelper()主要用于保障Stack的容量,在合理范围第三步:真正实现元素的添加,将该元素添加到栈顶,数目加1;(3)删除元素

f11f3a292df5e0feef5e447ea97001ad5edf7225.jpeg?token=878738c4455f4e4f06dd558b83e37463&s=B2C1B14E0AE0AD7A1E59D00A0000F081

在这里我们发现,真正实现删除操作的是removeElementAt;我们追踪进去:

562d5036eb01b4d4a026f49855378e51.png

synchronized 说明了这是一个线程安全的方法,删除操作就有点复杂了,没关系我们继续分析:

第一步:它在添加元素的时候首先将modCount加1,保证线程安全。第二步:第一个if判断删除元素是否超出了存储的数量范围第三步:第二个if判断待删除的元素下标大于0第四步:第三个if将元素后移第五步:将数量减小1第六步:将最上面的元素置为空,也就是删除了元素。(4)查找操作

在上面删除的时候我们发现了其实有一个peek()方法我们没有将,他的作用就是返回stack中最顶端的元素。

67145d714ef61a547a2b5758d5801863.png

但是还有一个最正式的查找操作:

5bf9f19eda95348848fa1d84358d6975.png

该方法返回所查找对象所处的位置,如果不存在在返回-1;

第一步:通过lastLindexOf(Object)方法返回从栈底到栈顶最下面的的那个元素的下标,第二步:利用元素的总数目减去所处的下标就得到了元素的位置(),并且返回否则返回-1;(5)其他方法

这里提供的其他方法只有一个判断是否为空

ca44efbb7ed54cc551a24e38794f96a3.png

以上就列出了Stack的所有源码,超级简单。最后我们就来对它进行有一个总结

三、总结

stack是继承自Vector,底层使用数组存储、用来模拟栈的一个java集合。同时也是线程安全的。使用场景比如说倒序输出、XML语法检查。最主要的是面试还经常使用到它,因此你主要还是在机试的时候灵活的去使用它。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值