LinkedList中peek()与peekFirst()方法的区别是什么?
Deque中peek()与peekFirst()的区别
对于标准的Java Deque实现(比如你用的LinkedList),在绝大多数场景下调用peek()和peekFirst()会得到相同的结果,但两者的设计初衷与语义定位存在差异:
接口来源与语义差异
peek()是从Queue接口继承的方法,语义聚焦于"队列头部元素",因为Queue遵循FIFO规则,所以队列头部对应双端队列的第一个元素。peekFirst()是Deque接口自身定义的方法,语义明确指向"双端队列的首元素",属于双端操作体系的一部分(对应还有peekLast()用于获取尾元素)。
实现层面的关联
在Java核心Deque实现类(如LinkedList、ArrayDeque)中,peek()的底层实现就是直接调用peekFirst()。以LinkedList为例,源码里peek()的逻辑完全复用peekFirst()的结果,这也是你测试时输出一致的原因。是否存在差异场景?
理论上自定义Deque实现可以让peek()返回不同于peekFirst()的结果,但这违背了Deque接口的规范——Java官方文档明确要求,当Deque作为Queue使用时,队列头部必须对应双端队列的首元素,因此规范层面peek()等价于peekFirst()。存在意义的区别
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
相关产品推荐
相关产品推荐

