java怎么申请栈
- 后端开发
- 2025-05-28
- 11
栈(Stack)是一种经典的后进先出(LIFO)数据结构,Java中可通过多种方式实现栈的申请与使用,以下是详细方法,涵盖官方推荐方案与自定义实现方案,适用于不同开发场景。
使用Java内置的Stack类
Java标准库提供了java.util.Stack类,可直接实例化使用,但需注意,官方推荐优先使用Deque接口替代Stack类(原因后述)。
核心方法:
- push(E item):元素入栈
- pop():移除并返回栈顶元素
- peek():查看栈顶元素(不移除)
- empty():判断栈是否为空
优先推荐的Deque实现方案
Java官方文档建议使用Deque接口替代Stack类,因Stack继承自Vector,存在同步锁性能开销,而Deque更灵活且线程安全性可控。

import java.util.ArrayDeque; import java.util.Deque; public class DequeStackExample { public static void main(String[] args) { // 使用ArrayDeque实现栈 Deque<Integer> stack = new ArrayDeque<>(); stack.push(30); stack.push(40); System.out.println(stack.pop()); // 40 System.out.println(stack.peek()); // 30 } }
优势:

- 性能更优:ArrayDeque无同步开销,入栈/出栈时间复杂度为O(1)
- 功能扩展:支持队列操作(如addLast()和removeFirst())
手动实现栈(自定义)
若需深入理解栈原理或应对特殊场景,可手动实现栈,以下是两种常见方案:
基于数组的栈
public class ArrayStack { private int maxSize; private int[] stackArray; private int top; public ArrayStack(int size) { maxSize = size; stackArray = new int[maxSize]; top = -1; // 栈顶指针初始化为-1 } public void push(int value) { if (isFull()) throw new IllegalStateException("栈已满"); stackArray[++top] = value; } public int pop() { if (isEmpty()) throw new EmptyStackException(); return stackArray[top--]; } public int peek() { return stackArray[top]; } public boolean isEmpty() { return top == -1; } public boolean isFull() { return top == maxSize - 1; } }
基于链表的栈
public class LinkedListStack { private static class Node { int data; Node next; Node(int data) { this.data = data; } } private Node top; public void push(int value) { Node newNode = new Node(value); newNode.next = top; top = newNode; } public int pop() { if (isEmpty()) throw new EmptyStackException(); int value = top.data; top = top.next; return value; } public int peek() { if (isEmpty()) throw new EmptyStackException(); return top.data; } public boolean isEmpty() { return top == null; } }
应用场景与选择建议
| 实现方式 | 适用场景 | 注意事项 |
|---|---|---|
| Deque | 常规开发,需高性能、标准实现 | 优先选择 |
| Stack类 | 旧代码兼容 | 不建议新项目使用 |
| 自定义数组栈 | 内存有限,需严格控制空间 | 需预设容量 |
| 自定义链表栈 | 频繁动态扩容,避免内存碎片 | 单个节点内存开销略高 |
常见问题解答
-
Q:为什么Java建议用Deque代替Stack?
A:Stack继承自线程安全的Vector,导致性能损耗;Deque提供更清晰的栈操作语义,且实现类(如ArrayDeque)效率更高¹。
-
Q:如何选择栈的容量?
A:数组栈需预设合理大小,避免频繁扩容;链表栈无需预设容量,但每个节点需额外存储指针。
引用说明
[1] Oracle Java Documentation, Deque Interface
[2] 《Effective Java》第三版, Joshua Bloch, 条款18
