在Java中,pollFirst 和 pollLast 是 ArrayDeque 提供的两个基础但至关重要的操作,它们均能以 O(1) 的时间复杂度移除并返回队列的端点元素。简单来说,pollFirst 负责处理队头,pollLast 负责处理队尾。当队列为空时,两者都返回 null,不会抛出异常,也不会触发扩容操作,且非线程安全。

pollFirst 和 pollLast 是 ArrayDeque 中用于移除并返回队列端点元素的核心方法,分别作用于队头(前端)和队尾(后端)。它们都会返回被移除的元素,若队列为空则返回 null。
pollFirst:从队头移除元素
pollFirst 的行为模拟了队列的先进先出(FIFO)特性——取出并删除当前最靠前的元素,即下标最小的有效元素。其内部通过调整头指针(head)来实现,时间复杂度为 O(1)。需要注意的是,该方法并不检查元素是否为 null,仅根据队列结构判断是否存在有效元素。
- 当队列为空时调用返回
null,不会抛出异常 - 适合作为双端队列的出队操作,例如在广度优先搜索(BFS)中按层处理时,从队头取出节点
- 与
removeFirst()不同,后者在队列为空时会抛出NoSuchElementException
pollLast:从队尾移除元素
pollLast 模拟了栈的后进先出(LIFO)特性——取出并删除当前最靠后的元素,即下标最大的有效元素。它通过调整尾指针(tail)来完成,同样具有 O(1) 的时间复杂度。
- 常用于需要回溯或逆序处理的场景,比如解析表达式、撤销操作缓存等
- 与
removeLast()的区别同样在于空队列时返回null还是抛出异常 - 若将
ArrayDeque当作栈来使用,pollLast()等价于栈的pop()操作
使用时需注意的细节
这两个方法都不会涉及数组扩容或缩容,仅改变逻辑边界;实际底层数组空间可能仍保留已移除元素的引用,但后续插入操作会自然覆盖这些位置。在多线程环境下,它们并非线程安全,需要外部同步机制来保证数据一致性。
- 不要依赖返回值是否为
null来判断元素本身是否为null——因为ArrayDeque允许存入null,而pollFirst/pollLast返回null仅表示队列为空 - 若需要区分“空队列”和“队列中包含 null 元素”,应提前使用
isEmpty()进行判断 - 连续多次调用不会导致性能衰减,因为底层采用循环数组结构,头尾指针独立移动
简单对比示例
假设初始化一个 ArrayDeque:
dq.pollFirst()→ 返回"a",队列变为["b", "c"]dq.pollLast()→ 返回"c",队列变为["b"]- 再调用
pollFirst()→ 返回"b",队列变为空 - 此时再调用任一方法都返回
null
