linkedlist本质是双向链表且实现deque接口,天然支持fifo队列(offer/poll/peek)和lifo栈(push/pop/peek),优于同步低效的stack类;但非线程安全,随机访问为o(n)。

Java 中的 LinkedList 本质是双向链表,它同时实现了 Deque(双端队列)接口,因此天然支持队列(FIFO)和栈(LIFO)两种行为,无需额外封装。
用 LinkedList 实现队列(FIFO)
队列要求先进先出,推荐使用 Deque 接口定义的标准队列方法,语义清晰且线程不安全场景下性能良好。
-
入队:用
offer(e)或add(e)(后者失败时抛异常)——元素加到队尾 -
出队:用
poll()(空时返回null)或remove()(空时抛异常)——从队首取走元素 -
查看队首:用
peek()(空时返回null)或element()(空时抛异常)
示例:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
queue.offer("A"); // 入队
queue.offer("B");
String first = queue.poll(); // 返回 "A",队列剩 ["B"]
用 LinkedList 实现栈(LIFO)
栈要求后进先出,LinkedList 提供了与 Stack 类相似的方法,但更推荐使用 Deque 接口的栈语义方法(避免遗留的 Stack 类)。
-
入栈:用
push(e)——等价于addFirst(e),插到链表头部 -
出栈:用
pop()——等价于removeFirst(),移除并返回头部元素 -
查看栈顶:用
peek()——等价于getFirst(),不移除
注意:peek() 在队列和栈中都可用,含义取决于操作上下文(队首/栈顶),实际都指向链表头节点。
stack.push(1);
stack.push(2);
int top = stack.pop(); // 返回 2
为什么不用 Stack 类?
java.util.Stack 继承自 Vector,底层是数组,所有操作同步(synchronized),性能差;且设计上违反“组合优于继承”原则。官方文档明确建议用 Deque 实现栈,LinkedList 是最常用选择。
关键细节提醒
-
LinkedList不是线程安全的,多线程环境需外部同步(如Collections.synchronizedList)或改用ConcurrentLinkedDeque - 虽然支持
get(i)随机访问,但时间复杂度为 O(n),频繁按索引查值应换用ArrayList - 作为队列使用时,避免混用
addFirst/removeLast等双端操作,否则破坏 FIFO 语义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










