Java面试题更新 2026-08-05

请从使用方法、底层实现和典型应用场景三个方面,说明 Java 中栈和队列的差异。

技术原理Java

考察说明

考查对 Java 中栈和队列在定义、使用及实现层面的掌握程度。

回答思路

  1. 【回答框架 1】栈是后进先出(LIFO)的线性表,队列是先进先出(FIFO)的线性表。在 Java 中,栈通常使用 Deque 接口的 ArrayDeque 或 LinkedList 实现,已不建议使用 Stack 类;队列通常使用 Queue 接口,常见实现有 LinkedList 和 PriorityQueue。
  2. 【回答框架 2】使用方法上,栈操作对应 push(入栈)、pop(出栈)和 peek(查看栈顶);队列操作对应 offer(入队)、poll(出队)和 peek(查看队首)。在 Java 中,Deque 也提供了 addFirst、removeFirst 等方法,但推荐使用 push/pop 以明确栈语义。
  3. 【回答框架 3】底层实现上,栈和队列都可以用数组或链表实现。数组实现支持随机访问但容量有限,可能扩容;链表实现无需扩容但每个节点有额外空间开销。在 Java 中,ArrayDeque 基于循环数组,LinkedList 基于双向链表,两者都不是线程安全的。
  4. 【回答框架 4】典型应用场景:栈常用于表达式求值、括号匹配、函数调用、撤销操作等;队列常用于任务调度、消息队列、缓冲区、广度优先搜索(BFS)等。在并发场景下,Java 提供了 ConcurrentLinkedQueue 和 BlockingQueue 接口的实现,满足线程安全需求。
  5. 【关键点 1】栈是 LIFO,队列是 FIFO。
  6. 【关键点 2】Java 中栈推荐使用 Deque,如 ArrayDeque;队列使用 Queue,如 LinkedList。
  7. 【关键点 3】栈的常用方法:push、pop、peek;队列的常用方法:offer、poll、peek。
  8. 【关键点 4】ArrayDeque 基于循环数组,LinkedList 基于双向链表。
  9. 【关键点 5】栈适用表达式求值、括号匹配;队列适用任务调度、BFS。
  10. 【易错点 1】不要直接使用 Stack 类,因为其继承 Vector,性能较慢且线程安全开销大。
  11. 【易错点 2】不要把 Deque 简单当作队列,需注意其双端特性,操作不同。
  12. 【易错点 3】忽略线程安全,非并发场景使用 ArrayDeque 或 LinkedList,并发场景需使用并发集合。