LinkedList的底层原理解析以及他的常用方法解释给出代码示例
时间: 2025-07-20 16:20:05 浏览: 5
<think>我们聚焦于Java中LinkedList的底层原理、常用方法及使用示例。根据引用内容,LinkedList基于双向链表实现,每个节点由Node类表示,包含元素值、前驱节点引用和后继节点引用。下面将分步骤详细说明:
### 1. LinkedList底层原理
- **双向链表结构**:LinkedList由一系列节点(Node)组成,每个节点包含:
- `item`:存储实际数据
- `prev`:指向前一个节点的引用
- `next`:指向后一个节点的引用
- **首尾指针**:LinkedList维护`first`和`last`两个指针,分别指向链表的头节点和尾节点。
- **增删原理**:
- **删除**:当删除元素时,只需调整相邻节点的引用(如删除节点x:将x.prev.next指向x.next,x.next.prev指向x.prev)[^1][^2]。
- **插入**:在指定位置插入元素时,创建新节点并调整相邻节点的引用(如节点a和b之间插入x:a.next=x, x.prev=a; x.next=b, b.prev=x)。
### 2. 常用方法说明及代码示例
#### 核心方法:
| 方法 | 描述 | 时间复杂度 |
|------|------|------------|
| `add(E e)` | 添加元素到链表末尾 | $O(1)$ |
| `add(int index, E e)` | 在指定位置插入元素 | $O(n)$(需遍历定位) |
| `remove(int index)` | 删除指定位置元素 | $O(n)$(需遍历定位) |
| `get(int index)` | 获取指定位置元素 | $O(n)$ |
| `removeFirst()` | 删除头节点 | $O(1)$ |
| `removeLast()` | 删除尾节点 | $O(1)$ |
#### 示例代码:
```java
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
// 添加元素
list.add("A"); // [A]
list.addFirst("B"); // [B, A]
list.addLast("C"); // [B, A, C]
// 获取元素
String first = list.getFirst(); // "B"
String last = list.getLast(); // "C"
String mid = list.get(1); // "A"
// 删除元素
list.removeFirst(); // 移除"B" → [A, C]
list.removeLast(); // 移除"C" → [A]
list.remove(0); // 移除"A" → []
}
}
```
### 3. 性能特点
- **优势**:
- 头尾插入/删除高效($O(1)$)。
- 动态扩容无额外开销(无需像ArrayList复制数组)。
- **劣势**:
- 随机访问慢(需遍历链表,最坏$O(n)$)。
- 内存占用较高(每个节点多存储两个引用)。
### 4. 适用场景
- 频繁在头尾增删元素(如队列、栈)。
- 无需随机访问,主要按顺序遍历。
§§相关问题§§
1. LinkedList和ArrayList在内存占用上的具体差异是什么?
2. 如何用LinkedList实现栈(Stack)或队列(Queue)?
3. 为什么LinkedList的随机访问性能比ArrayList差?
4. LinkedList在并发环境下是否安全?如何实现线程安全?
5. Java中LinkedList的迭代器(Iterator)有什么特点?
[^1]: Java集合底层源码剖析-ArrayList和LinkedList
[^2]: LinkedList底层原理</think>### Java LinkedList底层原理、常用方法及使用示例
#### 1. LinkedList底层原理
LinkedList基于**双向链表**实现,核心是内部类`Node`:
```java
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;
}
}
```
- **内存结构**:每个节点存储数据 + 两个指针(前驱/后继)
- **首尾指针**:LinkedList维护`first`和`last`指针,指向头尾节点
- **增删原理**:
- **删除**:断开目标节点的前后链接 → 前节点.next=后节点,后节点.prev=前节点
- **插入**:创建新节点 → 调整相邻节点的prev/next指针指向新节点
- **时间复杂度**:
- 头尾操作:$O(1)$
- 随机访问:$O(n)$(需遍历链表)
#### 2. 常用方法及代码示例
| 方法 | 描述 | 时间复杂度 |
|------|------|------------|
| `add(E e)` | 添加元素到末尾 | $O(1)$ |
| `addFirst(E e)` | 头部插入 | $O(1)$ |
| `addLast(E e)` | 尾部插入 | $O(1)$ |
| `removeFirst()` | 删除头部元素 | $O(1)$ |
| `removeLast()` | 删除尾部元素 | $O(1)$ |
| `get(int index)` | 获取指定位置元素 | $O(n)$ |
| `remove(int index)` | 删除指定位置元素 | $O(n)$ |
**完整示例代码**:
```java
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
// 添加元素
list.add("A"); // [A]
list.addFirst("B"); // [B, A]
list.addLast("C"); // [B, A, C]
System.out.println("初始化后: " + list); // 输出: [B, A, C]
// 删除元素
list.removeFirst(); // 移除B → [A, C]
list.removeLast(); // 移除C → [A]
System.out.println("删除后: " + list); // 输出: [A]
// 插入元素
list.add(0, "X"); // 头部插入 → [X, A]
list.add(1, "Y"); // 位置1插入 → [X, Y, A]
System.out.println("插入后: " + list); // 输出: [X, Y, A]
// 访问元素
System.out.println("首元素: " + list.getFirst()); // X
System.out.println("索引1: " + list.get(1)); // Y
}
}
```
#### 3. 核心特性总结
1. **动态内存**:无需连续内存空间,适合频繁增删场景
2. **队列支持**:天然实现`Deque`接口,可直接作为队列/栈使用
3. **内存开销**:每个元素额外消耗~24字节(Node对象头16B + 3引用)
4. **线程安全**:**非线程安全**,多线程需用:
```java
List<String> safeList = Collections.synchronizedList(new LinkedList<>());
```
#### 4. 使用场景推荐
- ✅ 频繁在头/尾增删元素(如队列操作)
- ✅ 未知数据量且需要动态扩容
- ❌ 需要随机访问(优先选ArrayList)
- ❌ 内存敏感场景(节点额外开销大)
阅读全文
相关推荐



















