Java ArrayDeque pollFirst 与 pollLast 方法处理队头队尾元素

作者:技术拾光

时间:2026-07-21

浏览:633

ArrayDeque的pollFirst和pollLast方法以O(1)时间复杂度从队头或队尾移除并返回元素,队列为空时返回null而不抛异常。由于ArrayDeque禁止存储null,因此返回null仅表示队列为空,需注意与元素值为null的情况区分。该类非线程安全,多线程环境下需额外同步。

文章目录

在 Java 开发中,ArrayDeque 提供了两个基础但至关重要的方法:pollFirst 和 pollLast。它们均以 O(1) 时间复杂度“移除并返回端点元素”,分别处理队头与队尾。当队列为空时,两者均返回 null,不会抛出异常,也不触发扩容操作,且非线程安全。

Java ArrayDeque pollFirst 与 pollLast 方法处理队头队尾元素

pollFirst 和 pollLast 是 ArrayDeque 中用于移除并返回队列端点元素的核心方法,分别操作队头(前端)和队尾(后端)。它们都返回被移除的元素,若队列为空则返回 null。

pollFirst:从队头移除元素

该方法模拟了队列的先进先出(FIFO)行为——取出并删除当前最靠前的元素,即下标最小的有效元素。内部通过调整头指针(head)实现,时间复杂度 O(1)。需要留意的是,它不检查元素是否为 null,只依据队列结构判断是否存在有效元素。

  • 空队列调用返回 null,不会抛异常
  • 适合用作双端队列的“出队”操作,例如在 BFS 中按层处理时从头取节点
  • 与 removeFirst() 不同,后者为空时抛 NoSuchElementException

pollLast:从队尾移除元素

这一方法模拟了栈的后进先出(LIFO)——取出并删除当前最靠后的元素,即下标最大的有效元素。内部通过调整尾指针(tail)完成,同样是 O(1)。

  • 常用于需要回溯或逆序处理的场景,如解析表达式、撤销操作缓存
  • 与 removeLast() 的区别同样在于空队列时返回 null 还是抛异常
  • 若将 ArrayDeque 当作栈使用,pollLast() 等价于栈的 pop()

使用时需注意的细节

这两个方法都不涉及数组扩容或缩容,只改变逻辑边界;实际底层数组空间可能仍保留已移除元素的引用,但后续插入会自然覆盖。多线程环境下非线程安全,需要外部同步。

  • 不要依赖返回值是否为 null 来判断元素本身是否为 null——因为 ArrayDeque 允许存入 null,但 pollFirst/pollLast 返回 null 只表示队列为空
  • 若需区分“空队列”和“队列含 null 元素”,应提前用 isEmpty() 判断
  • 连续多次调用不会导致性能衰减,因底层是循环数组,头尾指针独立移动

简单对比示例

假设初始化 ArrayDeque dq = new ArrayDeque(Arrays.asList("a", "b", "c")):

  • dq.pollFirst() → 返回 "a",队列变为 ["b", "c"]
  • dq.pollLast() → 返回 "c",队列变为 ["b"]
  • 再调用 pollFirst() → 返回 "b",队列变为空
  • 此时再调用任一方法都返回 null

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章