摘要:作为Java集合框架中最经典的双向链表实现,LinkedList在项目开发中占据重要地位。本文从数据结构、核心方法、源码级原理、企业级应用场景等8个维度深度剖析,带你彻底征服这个看似简单实则暗藏玄机的集合类!
📦 一、LinkedList基础认知
1.1 什么是LinkedList?
LinkedList是Java集合框架中List接口的双向链表实现,同时实现了Deque接口。与ArrayList的数组结构不同,其通过节点(Node)的前驱(prev)和后继(next)指针连接元素。每个节点存储三个关键信息:
- item:当前节点存储的实际数据
- prev:指向前一个节点的指针
- next:指向后一个节点的指针
这种结构使得在头部和尾部进行插入/删除操作的时间复杂度为O(1),但随机访问需要遍历链表,时间复杂度为O(n)。
1.2 数据结构特点
// JDK源码中的Node定义
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
特性对比表:
特性 | ArrayList | LinkedList |
---|---|---|
底层结构 | 动态数组 | 双向链表 |
随机访问效率 | O(1) | O(n) |
头部插入/删除 | O(n) | O(1) |
尾部插入/删除 | O(1) | O(1) |
中间插入/删除 | O(n) | O(n) |
内存占用 | 连续内存 | 分散内存+指针开销 |
迭代器性能 | 快速 | 快速 |
缓存友好性 | 好 | 差 |
⚙️ 二、核心API与使用实战
2.1 基础操作方法
// 初始化示例
List<String> techStack = new LinkedList<>();
// 增删改查操作
techStack.add("Java"); // 尾部添加
techStack.add(1, "Python"); // 指定位置插入
techStack.remove("Java"); // 删除元素
techStack.set(0, "Go"); // 修改元素
String lang = techStack.get(0);// 获取元素
// 特殊位置操作
techStack.addFirst("C++"); // 头部插入
techStack.addLast("Rust"); // 尾部插入
techStack.removeFirst(); // 删除头部
techStack.removeLast(); // 删除尾部
2.2 Deque接口方法
// 作为双端队列使用
Deque<String> deque = new LinkedList<>();
// 队列操作
deque.offer("Kafka"); // 尾部入队
deque.poll(); // 头部出队
// 栈操作
deque.push("Redis"); // 压栈