java stack 类继承 vector,在数组末尾进行 push/pop 操作实现 lifo;线程安全但性能低,官方推荐用 arraydeque 替代;需用 empty() 防止 emptystackexception。

Java 中的 Stack 类通过继承 Vector 并在顶部(即索引最大处)进行插入和删除操作,天然支持后进先出(LIFO)行为。
Stack 的底层机制依赖于 Vector 的动态数组
Stack 是一个线程安全的类,内部基于 Vector 实现。所有元素存储在数组中,新元素总是用 push() 添加到末尾(即当前 size 位置),而 pop() 总是移除并返回最后一个元素——这种“尾部增删”正是 LIFO 的核心体现。
-
push(E item)等价于addElement(item),将元素追加到数组末尾 -
pop()先调用peek()获取栈顶,再用removeElementAt(size()-1)删除末尾元素 -
peek()直接返回elementAt(size()-1),不修改结构
实际操作中需注意线程安全与性能取舍
虽然 Stack 的方法都加了 synchronized,适合多线程场景,但同步开销较大。若仅单线程使用,推荐用 ArrayDeque 替代——它同样支持 LIFO,且更快、更轻量。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
ArrayDeque时:`deque.push(x)` 和 `deque.pop()` 行为与Stack完全一致 -
Stack已被官方标记为“遗留类”,Java 文档建议优先使用Deque接口实现 - 避免混用
Stack的非栈方法(如elementAt(0)),否则破坏 LIFO 语义
典型 LIFO 操作示例清晰体现执行顺序
以下代码演示入栈与出栈如何严格遵循后进先出:
Stack<string> stack = new Stack();
stack.push("A"); // [A]
stack.push("B"); // [A, B]
stack.push("C"); // [A, B, C]
System.out.println(stack.pop()); // 输出 "C",栈变为 [A, B]
System.out.println(stack.pop()); // 输出 "B",栈变为 [A]
</string>
每次 pop() 都取走最后加入的那个,顺序完全可预测。
判断是否为空及查看栈顶不改变状态
除了增删,LIFO 还要求能安全探查当前状态而不破坏结构:
-
empty()返回size() == 0,用于循环或条件判断 -
peek()返回栈顶但不移除,适合“预览后决定是否处理”场景 - 调用
pop()或peek()前务必用empty()检查,否则抛EmptyStackException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










