Java LinkedList 全面指南:原理、方法与实战示例
Java LinkedList
通过实战代码示例与最佳实践,掌握 Java LinkedList 的高效数据操作技巧。
Java 集合框架中的 LinkedList 类实现了双向链表。每个元素(称为 节点)包含三个字段:
- prev — 指向前驱节点的引用(首元素为 null)
- next — 指向后继节点的引用(尾元素为 null)
- data — 节点存储的实际值
创建 Java LinkedList
用指定元素类型实例化:
LinkedList<Type> list = new LinkedList<>();
示例:
// Integer 列表
LinkedList<Integer> numbers = new LinkedList<>();
// String 列表
LinkedList<String> words = new LinkedList<>();
示例:创建 LinkedList
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> animals = new LinkedList<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
System.out.println("LinkedList: " + animals);
}
}
输出
LinkedList: [Dog, Cat, Cow]
该代码演示了通过 add() 向名为 animals 的 LinkedList 添加三个元素。
LinkedList 的工作原理
与数组不同,节点分散在内存中并通过链接连接。下图展示三个节点及其连接关系。

- Dog — 首节点,prev = null,next = Cat
- Cat — 中间节点,prev = Dog,next = Cow
- Cow — 尾节点,prev = Cat,next = null
深入了解请参阅 链表 条目。
LinkedList 的核心方法
以下为最常用操作:
- 添加元素
- 访问元素
- 更新元素
- 移除元素
1. 添加元素
用 add() 追加节点,可选指定索引:
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> animals = new LinkedList<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
System.out.println("LinkedList: " + animals);
animals.add(1, "Horse");
System.out.println("更新后的 LinkedList: " + animals);
}
}
输出
LinkedList: [Dog, Cat, Cow] 更新后的 LinkedList: [Dog, Horse, Cat, Cow]
第二个 add() 在索引 1 处插入 "Horse",后续元素后移。
2. 访问元素
用 get() 按索引获取:
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> languages = new LinkedList<>();
languages.add("Python");
languages.add("Java");
languages.add("JavaScript");
System.out.println("LinkedList: " + languages);
String str = languages.get(1);
System.out.print("索引 1 处的元素: " + str);
}
}
输出
LinkedList: [Python, Java, JavaScript] 索引 1 处的元素: Java
也可通过 iterator() 或 listIterator() 进行高级遍历。
3. 更新元素
用 set() 替换指定索引处的元素:
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> languages = new LinkedList<>();
languages.add("Java");
languages.add("Python");
languages.add("JavaScript");
languages.add("Java");
System.out.println("LinkedList: " + languages);
languages.set(3, "Kotlin");
System.out.println("更新后的 LinkedList: " + languages);
}
}
输出
LinkedList: [Java, Python, JavaScript, Java] 更新后的 LinkedList: [Java, Python, JavaScript, Kotlin]
4. 移除元素
用 remove() 按索引删除:
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> languages = new LinkedList<>();
languages.add("Java");
languages.add("Python");
languages.add("JavaScript");
languages.add("Kotlin");
System.out.println("LinkedList: " + languages);
String removed = languages.remove(1);
System.out.println("被移除的元素: " + removed);
System.out.println("更新后的 LinkedList: " + languages);
}
}
输出
LinkedList: [Java, Python, JavaScript, Kotlin] 被移除的元素: Python 新 LinkedList: [Java, JavaScript, Kotlin]
其他实用方法
| 方法 | 说明 |
|---|---|
contains() | 判断值是否存在 |
indexOf() | 首次出现的索引 |
lastIndexOf() | 最后一次出现的索引 |
clear() | 清空所有元素 |
iterator() | 提供迭代器 |
LinkedList 作为 Queue 与 Deque
因 LinkedList 实现 Queue 和 Deque,支持 FIFO 与 LIFO 操作。常用方法:
| 方法 | 说明 |
|---|---|
addFirst() | 头部添加 |
addLast() | 尾部添加 |
getFirst() | 查看头部 |
getLast() | 查看尾部 |
removeFirst() | 弹出头部 |
removeLast() | 弹出尾部 |
peek() | 查看头部不移除 |
poll() | 获取并移除头部 |
offer() | 尾部入队 |
示例:LinkedList 作为 Queue
import java.util.LinkedList;
import java.util.Queue;
class Main {
public static void main(String[] args){
Queue<String> languages = new LinkedList<>();
languages.add("Python");
languages.add("Java");
languages.add("C");
System.out.println("LinkedList: " + languages);
String first = languages.peek();
System.out.println("访问的元素: " + first);
String removed = languages.poll();
System.out.println("移除的元素: " + removed);
System.out.println("poll() 后的 LinkedList: " + languages);
languages.offer("Swift");
System.out.println("offer() 后的 LinkedList: " + languages);
}
}
输出
LinkedList: [Python, Java, C] 访问的元素: Python 移除的元素: Python poll() 后的 LinkedList: [Java, C] offer() 后的 LinkedList: [Java, C, Swift]
示例:LinkedList 作为 Deque
import java.util.LinkedList;
import java.util.Deque;
class Main {
public static void main(String[] args){
Deque<String> animals = new LinkedList<>();
animals.add("Cow");
System.out.println("LinkedList: " + animals);
animals.addFirst("Dog");
System.out.println("addFirst() 后: " + animals);
animals.addLast("Zebra");
System.out.println("addLast() 后: " + animals);
animals.removeFirst();
System.out.println("removeFirst() 后: " + animals);
animals.removeLast();
System.out.println("removeLast() 后: " + animals);
}
}
输出
LinkedList: [Cow] addFirst() 后: [Dog, Cow] addLast() 后: [Dog, Cow, Zebra] removeFirst() 后: [Cow, Zebra] removeLast() 后: [Cow]
遍历 LinkedList
增强 for 循环提供简洁遍历方式:
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> animals = new LinkedList<>();
animals.add("Cow");
animals.add("Cat");
animals.add("Dog");
System.out.println("LinkedList: " + animals);
System.out.println("遍历链表元素:");
for(String animal: animals){
System.out.print(animal + ", ");
}
}
}
输出
LinkedList: [Cow, Cat, Dog] 遍历链表元素: Cow, Cat, Dog,
LinkedList 与 ArrayList 对比
两者均实现 List,但性能特征不同:
| LinkedList | ArrayList |
|---|---|
实现 List、Queue、Deque | 仅实现 List |
| 节点存储 prev、data、next | 单个元素占数组槽位 |
| 双向链表结构 | 可调整大小的数组 |
| 已知位置时插入/删除 O(1) | 指定索引后插入需移动 O(n) |
| 随机访问需遍历 O(n) | 直接索引访问 O(1) |
注意:可通过任一接口实例化 LinkedList:
// 通过 List
List<String> animals1 = new LinkedList<>();
// 通过 Queue
Queue<String> animals2 = new LinkedList<>();
// 通过 Deque
Deque<String> animals3 = new LinkedList<>();
使用接口引用时,仅能访问该接口定义的方法。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比
- Java 8 速查手册:核心新特性、语法、API 与最佳实践一站式参考