Java LinkedList
LinkedList 是 List 接口的链表实现:每个元素是一个节点,节点保存数据并指向前后节点,像一条手拉手的链子。它擅长频繁的插入、删除,缺点是按下标随机访问较慢,适合“增删多、随机读少”的场景。
链表原理与适用场景
LinkedList 底层是双向链表:插入或删除元素只需改动前后节点的指针,不用像数组那样搬移大片元素,所以中间增删很快。按下标取元素则要从头(或尾)逐个走,比 ArrayList 慢。它同时实现了 Deque 接口,因此能当队列和栈用。
常用方法
LinkedList 比 ArrayList 多了一整套“首尾操作”方法:
| 方法 | 作用 | 失败行为 |
|---|---|---|
| addFirst / addLast | 头部 / 尾部添加 | 抛异常 |
| removeFirst / removeLast | 删除并返回头部 / 尾部元素 | 抛异常 |
| getFirst / getLast | 查看头部 / 尾部元素 | 抛异常 |
| offer / poll / peek | 队列语义的入队 / 出队 / 查看 | 返回 null |
完整示例:
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("苹果"); // 末尾添加
list.addFirst("香蕉"); // 头部添加
list.addLast("西瓜"); // 尾部添加
System.out.println(list); // 输出:[香蕉, 苹果, 西瓜]
list.removeFirst(); // 移除头部
list.removeLast(); // 移除尾部
System.out.println(list); // 输出:[苹果]
System.out.println(list.getFirst()); // 输出:苹果
System.out.println(list.getLast()); // 输出:苹果
System.out.println(list.size()); // 输出:1
}
}
当作队列和栈使用
LinkedList 实现了 Deque(双端队列)接口,既当队列(先进先出),也当栈(后进先出):
import java.util.LinkedList;
public class QueueStackDemo {
public static void main(String[] args) {
// 当队列:offer 入队,poll 出队
LinkedList<String> queue = new LinkedList<>();
queue.offer("A");
queue.offer("B");
System.out.println(queue.poll()); // 输出:A
// 当栈:push 入栈,pop 出栈
LinkedList<String> stack = new LinkedList<>();
stack.push("1");
stack.push("2");
System.out.println(stack.pop()); // 输出:2
}
}
与 ArrayList 对比
| 对比项 | ArrayList | LinkedList |
|---|---|---|
| 底层结构 | 动态数组 | 双向链表 |
| 按下标随机访问 | 快 O(1) | 慢 O(n) |
| 中间插入 / 删除 | 慢(搬移元素) | 快(改指针) |
| 额外内存 | 少 | 每节点多存两个指针 |
| 适合场景 | 读多写少 | 频繁增删、队列、栈 |
小结:LinkedList 是双向链表实现的 List,增删快、随机访问慢;它还实现了 Deque,可当队列与栈使用;读多写少的场景应选 ArrayList。