Java中LinkedList实现Deque接口,天然支持LIFO栈操作:push()等价addFirst()、pop()等价removeFirst(),均O(1)时间复杂度;推荐声明为Deque类型而非Stack类,避免遗留设计缺陷。

Java 中的 LinkedList 实现了 Deque 接口,因此天然支持作为 LIFO(后进先出)双端栈使用,push() 和 pop() 方法正是为此设计的——它们操作的是链表**头部(首端)**,符合栈语义。
push() 和 pop() 的实际行为
push(E e) 等价于 addFirst(e),把元素插入到链表开头;pop() 等价于 removeFirst(),移除并返回开头元素。两者配合就是标准栈操作,时间复杂度均为 O(1)。
- 栈顶 = 链表第一个节点(索引 0 位置)
- 不建议用
addLast()/removeLast()模拟栈,那会变成“尾部栈”,虽可行但违背常规理解 - 调用
pop()时若栈为空,会抛出NoSuchElementException,需自行判空
正确使用示例
直接用 LinkedList 声明为 Deque 类型更清晰,体现栈意图:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Deque<Integer> stack = new LinkedList<>(); stack.push(1); // [1] stack.push(2); // [2, 1] stack.push(3); // [3, 2, 1] int top = stack.pop(); // 返回 3,stack 变为 [2, 1] top = stack.pop(); // 返回 2,stack 变为 [1]
和 Stack 类对比
java.util.Stack 是遗留类,继承自 Vector,线程安全但性能差、设计过时(如允许随机访问,破坏栈抽象)。官方推荐用 Deque 实现替代:
立即学习“Java免费学习笔记(深入)”;
-
LinkedList作为Deque使用,轻量、高效、语义明确 - 避免使用
Stack的peek()、empty()等非标准方法,统一用peekFirst()、isEmpty() - 若需线程安全,可包装为
Collections.synchronizedDeque(...),而非依赖Stack
实用小提醒
日常编码中注意三点:
- 声明类型优先用
Deque<E>,而不是LinkedList<E>,增强可读性和可替换性 - 入栈前无需检查容量;出栈前建议用
!stack.isEmpty()防异常 -
offerFirst()/pollFirst()是更通用的“失败不抛异常”版本,适合不确定是否为空的场景

















