java中linkedlist直接实现queue和deque接口,可直接用作fifo队列(offer/poll/peek)和双端队列(offerfirst/polllast等),推荐使用接口方法以保证语义清晰、空值安全及实现可替换性。

Java 中的 LinkedList 本身就实现了 Queue 和 Deque 接口,因此无需额外包装,直接用它就能做队列和双端队列的所有常见操作。
作为标准队列(FIFO)使用
把 LinkedList 当作普通队列时,遵循“先进先出”原则,推荐使用 Queue 接口定义的方法,语义清晰且安全:
-
入队:用
offer(E e)(成功返回true,失败不抛异常;比add()更健壮) -
出队:用
poll()(取并移除队首元素,为空时返回null;比remove()更安全) -
查看队首但不移除:用
peek()(为空时返回null)
示例:
Queuequeue.offer("a");
queue.offer("b");
System.out.println(queue.peek()); // "a"
System.out.println(queue.poll()); // "a"
System.out.println(queue.poll()); // "b"
作为双端队列(Deque)使用
当需要从两端添加或删除元素时,直接把 LinkedList 当作 Deque 用。它支持头尾双向操作,方法命名明确区分方向:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
队首操作:
offerFirst(E)、pollFirst()、peekFirst() -
队尾操作:
offerLast(E)、pollLast()、peekLast() - 也可用等价的栈风格方法:
push()≡offerFirst(),pop()≡pollFirst()
示例(模拟滑动窗口最大值辅助结构):
Dequedeque.offerLast(1);
deque.offerLast(3);
deque.offerFirst(0); // [0, 1, 3]
System.out.println(deque.pollFirst()); // 0
System.out.println(deque.pollLast()); // 3
注意:避免混用接口与具体类方法
虽然 LinkedList 自身有 addFirst()、removeLast() 等方法,但建议优先使用 Deque 接口定义的标准方法(如 offerFirst),原因有二:
- 语义统一:所有
Deque实现(如ArrayDeque)都支持这些方法,便于后期替换实现 - 空值处理一致:
offer/poll/peek系列对空集合返回null或false,而add/remove系列可能抛NoSuchElementException
性能与适用场景提醒
LinkedList 的链表结构决定了:
- 在头尾增删是
O(1),适合高频插入/删除的队列或双端队列场景 - 随机访问(
get(int))是O(n),不适合按索引频繁查元素 - 如果只做单端队列且无并发需求,
ArrayDeque通常比LinkedList更快(数组+指针,缓存友好)
除非明确需要链表特性(如迭代中修改结构),否则队列首选 ArrayDeque;但若已用 LinkedList,放心调用其 Deque 方法即可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










