You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LinkedList中peek()与peekFirst()方法的区别是什么?

Deque中peek()与peekFirst()的区别

对于标准的Java Deque实现(比如你用的LinkedList),在绝大多数场景下调用peek()和peekFirst()会得到相同的结果,但两者的设计初衷与语义定位存在差异:

  1. 接口来源与语义差异

    • peek() 是从 Queue 接口继承的方法,语义聚焦于"队列头部元素",因为Queue遵循FIFO规则,所以队列头部对应双端队列的第一个元素。
    • peekFirst() 是Deque接口自身定义的方法,语义明确指向"双端队列的首元素",属于双端操作体系的一部分(对应还有peekLast()用于获取尾元素)。
  2. 实现层面的关联
    在Java核心Deque实现类(如LinkedList、ArrayDeque)中,peek()的底层实现就是直接调用peekFirst()。以LinkedList为例,源码里peek()的逻辑完全复用peekFirst()的结果,这也是你测试时输出一致的原因。

  3. 是否存在差异场景?
    理论上自定义Deque实现可以让peek()返回不同于peekFirst()的结果,但这违背了Deque接口的规范——Java官方文档明确要求,当Deque作为Queue使用时,队列头部必须对应双端队列的首元素,因此规范层面peek()等价于peekFirst()。

  4. 存在意义的区别
    peek()的存在是因为Deque继承了Queue接口,目的是让Deque可以直接当作Queue使用,适配FIFO场景的代码逻辑;而peekFirst()是Deque为双端操作新增的方法,用于明确操作双端队列的首端,和peekLast()形成对称的双端操作API。


你的测试代码:

import java.util.LinkedList;
public class MyClass {
    public static void main(String args[]) {
        LinkedList<Integer> l = new LinkedList<>();
            l.add(2);
            l.addFirst(3);
            l.add(4);
            l.addLast(5);
            l.remove(2);
            l.offer(6);
            l.poll();
            l.add(7);
        System.out.println(l.toString());
        System.out.println(l.peek());
        System.out.println(l.peekFirst());
    }
}

测试输出:

[2, 5, 6, 7] // toString
2 // peek
2 // peekFirst

内容的提问来源于stack exchange,提问作者asperand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:30:49