List集合之Stack

150 阅读2分钟

本文已参加「新人创作礼」活动,一起开启掘进创作之路。

Stack概述

java.util.Stack集合继承java.util.Vector集合,所以其除了具备java.util.Vector的特性外,还具有栈的操作特性,也就是先入后出

Stack和Vector一样是线程安全的,但是在高并发的环境中具有性能问题,因此并不适合在高并发中使用;另外java.util.Stack在实际工作中已经不推荐使用了,如果我们在实际的工作中需要在非线程安全的环境使用栈,可以使用java.util.ArrayDeque;如果需要在线程安全的环境中使用栈结构,那么可以使用java.util.concurrent.LinkedBlockingDeque集合;未来我们还会介绍这两种集合;

我们怎么做?

Stack和Vector一样底层的数据结构为数组;那么如果让我们使用数组创建一个栈,我们应该怎么做呢?

数组的特性是我们可以根据索引位随机访问数组中的元素,而栈的操作特性是先入后出,所以我们可以把元素从索引位0依次向数组尾部存放,然后获取的时候从尾部依次向头部进行获取,是不是就满足栈的特性了;或者我们从元素的尾部依次向前存放元素,然后获取的时候依次从头部获取,也可以达到栈的操作效果;但是两种实现方案并不是一样的,因为Stack是支持动态扩容的,和Vector一样是1倍扩容?聪明的小伙伴可以思考下,这两种方案哪一种更好呢?

Stack是如何实现的呢?

Stack使用数组的尾部模拟栈顶,使用数组的头部模拟栈底,也就是我们说的第一种方案;关于Stack和Vector很多小伙伴问我为什么不能用了,既然不能用为什么还要设计它,存在就是合理的;其实这是因为我们使用的技术一直在发展呀,他们的稳定性和安全性是没有问题的,唯一的问题是有专门用于高并发场景中的集合将他们替代了。

Stack中关键的方法

E push(E item)新增元素
E pop()移除栈顶对象,并返回该对象
E peek(E item)返回栈顶部的对象,不删除
int search(Object o)返回对象在栈的位置,以1为基数
boolean empty()是否是空的

Stack相关的内容比较简单,今天就简单写到这里喽