Java 17 中的堆栈 Stack
对于该类 Stack 的表示意义是对象的后进先出(LIFO)堆栈。首次创建堆栈时,它不包含任何项目。它扩展了五个操作,用来操作 Vector 的集合。
需要注意的是 Deque 接口以及对应的实现提供了更完整、更一致的后进后厨堆栈操作,应该优先使用此方式。
public class Stack<E> extends Vector<E>

针对该图简单的说一下:<> 表示的是什么类型:
- <I>: interface 接口
- <A>: abstract 抽象类
- <C>: class 类
其中实线代表着是继承, 虚线代表着实现。 和就是 UML 的规则。
构造方法:

该类中的 API 定义:

使用方式简单演示
虽然 Stack 是 List 接口实现, 但是对于方法 peek()、empty()、pop()、push(E item)、search(Object o) 方法都是扩展的方法, 所以父类中并不存在,为了各个类中间来回转换。 直接定义 Stack 对象。
定义如下:
Stack<String> stack = new Stack<>();
对字符串进行操作,先存入对应的数据, 可以称为该过程为入栈:
System.out.println("存入数据!");
for (int i = 0; i < Integer.valueOf(args[0]); i++) {
stack.push(String.valueOf(i));
}
System.out.println(stack);
使用 peek() 方法查看当前堆栈顶部的数据。这里只是返回栈顶的数据并不会对数据进行删除。
System.out.print("查看栈顶的数据: ");
System.out.println(stack.peek());
根据 Stack 堆栈的后进先出的规则(LIFO)后来的先出。 上面的 .peek() 方法, 将显示最后一次添加进去的数据。
取出堆栈中的数据也很方便。 使用方法 pop 取出即可, 这里可以称为出栈, 或者叫做弹栈。
System.out.println(stack.pop());
在这里循环取出, 并判断当前的堆栈是否已经没有数据了。
System.out.print("取出栈顶的数据: ");
for (int i = 0; i < Integer.valueOf(args[0]); i++) {
if(stack.empty()){
System.out.println("堆栈中没有数据了");
break;
}
System.out.println(stack.pop());
System.out.print("显示当前数据: ");
System.out.println(stack);
}
当然也可以检索数据, 使用方法 search。
int index = stack.search("3");
需要注意该方法的返回值是从 1 开始的,并且是后进先出, 如果想使用 get(int index) 取得数据, 需要使用集合的总数减去返回的位置。
System.out.println("根据下标获得数据: " + stack.get(stack.size() - index));
最终的全部演示代码如下:

运行测试, 查看其中的效果是否和你想象的一致。

简化的流程是这样,这个是堆栈的流程, 并不是 Stack 的实现,它的实现就是使用了规则进行取值而已, 既然是后进先出, 保证其顺序的情况下,取值从最后往前取就好了,下面看看源码的实现就明白了。
写入数据 0

写入数据 1

写入数据2

省略其他的过程, 以此写入到 5。

这个时候栈顶就是最后写入的 5 。 如果这个时候想检索 4 的值。会得到下标的位置为 2。大概的流程就是这样了。
再次重申,集合和数据结构相辅相成的关系。 查看其源码, 发现Stack 还是大量的使用了 Vector 的实现, 比方说 pop 方法。


可以看到 调用了 java.util.Vector 的 addElement(E obj) 方法, 该方法又有调用了下面的方法 Vector.add(E e)。

最终调用了实际的方法为 Vector.add(E e, Object[] elementData, int s):

保存数据, 使元素数加一。
通过源码发现, 最终的实现, 只是硬性的让数据读出来了。 数据的存放并没有发生变化。

这也是为什么上面直接取其下标的时候, 还是和存入数据一致。
Java 的 Stack 就先说到这吧。 理解其中的思想, 比什么都重要。 很高兴您能看到这里。 这个知识点理解其概念,之后使用方法就可以忘记。下一章说说 Queue 队列之后。 可以使用其中的实现替代该方法。
历史的车轮一定会发生变迁, 变迁当然会有好有坏。好的多数都被保留的, 而坏的,多数人应该记不得了吧。
点赞, 收藏,关注。感谢您的阅读。