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()(空时抛异常)
示例:
Deque<String> queue = new LinkedList<>();queue.offer("A"); // 入队
queue.offer("B");
String first = queue.poll(); // 返回 "A",队列剩 ["B"]
用 LinkedList 实现栈(LIFO)
栈要求后进先出,LinkedList 提供了与 Stack 类相似的方法,但更推荐使用 Deque 接口的栈语义方法(避免遗留的 Stack 类)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
入栈:用
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 语义

















