一、LinkedList 介绍
LinkedList是List 接口的实现类,同时实现了Deque(双端队列)接口 ✅ List 共性:有序、可重复、带索引底层:双向链表,每个 Node 节点:prev前驱指针 + item数据 + next后继指针
✅ 核心特点
- 首尾增删速度快:只修改指针,不需要移动元素
- 查询慢:没有数组随机访问,按索引查找需要遍历链表
- 线程不安全,支持存储 null
- 兼具 List、队列、栈的功能,所以有两套首尾 API(一组抛异常,一组返回 null)
对比 ArrayList:
- ArrayList:可变数组 → 查询快,中间增删慢
- LinkedList:双向链表 → 首尾增删快,查询慢
二、LinkedList 特有方法(课件全部整理,分两类)
第一组:空集合调用时【抛出异常】
| 方法 | 功能描述 |
|---|---|
void addFirst(E e) | 将元素插入集合开头 |
void addLast(E e) | 将元素添加到集合结尾 |
E getFirst() | 返回第一个元素,空集合抛异常 |
E getLast() | 返回最后一个元素,空集合抛异常 |
E removeFirst() | 删除并返回第一个元素,空集合抛异常 |
E removeLast() | 删除并返回最后一个元素,空集合抛异常 |
第二组:空集合调用时【返回 null,不抛异常】(Deque 队列方法)
| 方法 | 功能描述 |
|---|---|
boolean offer(E e) | 元素添加到集合尾部 |
boolean offerFirst(E e) | 元素添加到集合开头 |
boolean offerLast(E e) | 元素添加到集合结尾 |
E peekFirst() | 获取第一个元素,集合为空返回 null |
E peekLast() | 获取最后一个元素,集合为空返回 null |
E pollFirst() | 删除并返回第一个元素,集合为空返回 null |
E pollLast() | 删除并返回最后一个元素,集合为空返回 null |
栈相关方法
| 方法 | 功能描述 |
|---|---|
void push(E e) | 元素压入链表开头(栈:入栈) |
配套:
pop()弹出头部元素(课件没写,配套考点)
💡 重点区分口诀:
- get /remove 开头:空了抛异常
- peek /poll 开头:空了返回 null,安全
三、遍历方式(包含 Lambda、方法引用)
- 普通 for 循环(不推荐,索引遍历效率低)
- 增强 for 循环
- Iterator 迭代器
- forEach + Lambda
linkedList.forEach(elem -> System.out.println(elem)); linkedList.forEach(System.out::println);四、完整代码示例
import java.util.LinkedList; public class TestLinkedList { public static void main(String[] args) { LinkedList<String> link = new LinkedList<>(); // 第一组(抛异常) link.addFirst("A"); link.addLast("B"); System.out.println(link.getFirst()); System.out.println(link.getLast()); // 第二组(返回null,安全) link.offerFirst("0"); link.offerLast("9"); link.offer("C"); System.out.println(link.peekFirst()); System.out.println(link.peekLast()); link.pollFirst(); link.pollLast(); // 栈操作 push入栈 link.push("Top"); System.out.println(link); // Lambda遍历 link.forEach(System.out::println); } }五、适用场景
✅ 适合:频繁首尾添加、删除;用作队列、栈 ❌ 不适合:大量随机索引查询
六、List 两大实现类对比
| 集合 | 底层结构 | 查询 | 中间增删 | 首尾增删 | 线程安全 |
|---|---|---|---|---|---|
| ArrayList | 可变数组 | 快 | 慢 | 慢 | 不安全 |
| LinkedList | 双向链表 | 慢 | 慢 | 很快 | 不安全 |
七、易错总结
- 多态写
List<String> list = new LinkedList<>()时,只能调用 List 接口方法,调用不了 addFirst、offerFirst 等特有方法,必须用 LinkedList 接收 - LinkedList 有索引只是逻辑编号,底层不是数组,没有随机访问
- 两套首尾 API 选择:不确定集合是否为空 → 优先用 peek/poll 系列,避免异常