在 Java 中,LinkedList 是 java.util 包中的一个类,它实现了 双向链表(Doubly Linked List) 数据结构。LinkedList 不仅可以作为普通的列表使用,还支持高效的插入和删除操作,非常适合用于需要频繁增删元素的场景。
LinkedList 的基本特点特性 | 描述 |
|---|---|
数据结构 | 双向链表 |
实现接口 |
|
索引访问 | 支持,但效率较低(O(n)) |
增删操作 | 在头尾或中间插入/删除效率高(尤其是头尾) |
线程安全 | 非线程安全,需手动同步 |
方法 | 描述 |
|---|---|
| 添加元素到末尾 |
| 在指定索引位置插入元素 |
| 获取指定索引处的元素 |
| 替换指定索引处的元素 |
| 删除指定索引处的元素 |
| 返回元素个数 |
方法 | 描述 |
|---|---|
| 添加到头部 |
| 添加到尾部 |
| 移除并返回头部元素 |
| 移除并返回尾部元素 |
| 获取头部元素(不移除) |
| 获取尾部元素(不移除) |
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.offer("A");
queue.offer("B");
queue.offer("C");
while (!queue.isEmpty()) {
System.out.println(queue.poll()); // 输出顺序:A B C
}
}
}import java.util.LinkedList;
public class StackExample {
public static void main(String[] args) {
LinkedList<String> stack = new LinkedList<>();
stack.push("A");
stack.push("B");
stack.push("C");
while (!stack.isEmpty()) {
System.out.println(stack.pop()); // 输出顺序:C B A
}
}
}LinkedList 可以配合 HashMap 来实现简单的 LRU 缓存机制(虽然更高效的是用 LinkedHashMap)。
import java.util.*;
public class LRUCache {
private final int capacity;
private Map<Integer, Integer> cacheMap;
private LinkedList<Integer> keyList;
public LRUCache(int capacity) {
this.capacity = capacity;
this.cacheMap = new HashMap<>();
this.keyList = new LinkedList<>();
}
public int get(int key) {
if (cacheMap.containsKey(key)) {
keyList.remove((Integer) key);
keyList.addFirst(key);
return cacheMap.get(key);
}
return -1;
}
public void put(int key, int value) {
if (cacheMap.containsKey(key)) {
keyList.remove((Integer) key);
} else if (cacheMap.size() >= capacity) {
int lastKey = keyList.removeLast();
cacheMap.remove(lastKey);
}
keyList.addFirst(key);
cacheMap.put(key, value);
}
public static void main(String[] args) {
LRUCache cache = new LRUCache(3);
cache.put(1, 10);
cache.put(2, 20);
cache.put(3, 30);
cache.get(2); // 访问后变成最近使用的
cache.put(4, 40); // 容量满,淘汰最后一个键(1)
System.out.println(cache.get(1)); // -1(已被淘汰)
System.out.println(cache.get(2)); // 20
}
}:ArrayList vs LinkedList操作 |
|
|
|---|---|---|
插入/删除(开头) | O(n) | O(1) |
插入/删除(中间) | O(n) | O(n)(需要遍历) |
插入/删除(结尾) | O(1)* | O(1) |
随机访问 | O(1) | O(n) |
内存占用 | 较低 | 较高(每个节点有前后指针) |
*扩容时为 O(n)
场景 | 推荐使用 |
|---|---|
高频插入/删除 | ✅ 强烈推荐 |
需要模拟栈或队列 | ✅ 推荐 |
高频随机访问 | ❌ 不推荐 |
节省内存 | ❌ 不推荐 |
实现 LRU 缓存 | ✅ 可以,但建议使用 |
ArrayList。LinkedList 更合适。Collections.synchronizedList(new LinkedList<>()) 或使用并发集合如 ConcurrentLinkedDeque。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。