本文已参加「新人创作礼」活动,一起开启掘进创作之路。
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相关的内容比较简单,今天就简单写到这里喽