首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java 中的LinkedList特点

Java 中的LinkedList特点

原创
作者头像
JQ实验室
发布2025-08-18 14:42:20
发布2025-08-18 14:42:20
1810
举报
文章被收录于专栏:都到8月了都到8月了

在 Java 中,LinkedListjava.util 包中的一个类,它实现了 双向链表(Doubly Linked List) 数据结构。LinkedList 不仅可以作为普通的列表使用,还支持高效的插入和删除操作,非常适合用于需要频繁增删元素的场景。


🧱 一、Java LinkedList 的基本特点

特性

描述

数据结构

双向链表

实现接口

List, Deque

索引访问

支持,但效率较低(O(n))

增删操作

在头尾或中间插入/删除效率高(尤其是头尾)

线程安全

非线程安全,需手动同步


📚 二、常用方法说明

✅ 作为 List 使用:

方法

描述

add(E e)

添加元素到末尾

add(int index, E element)

在指定索引位置插入元素

get(int index)

获取指定索引处的元素

set(int index, E element)

替换指定索引处的元素

remove(int index)

删除指定索引处的元素

size()

返回元素个数

✅ 作为 Deque(双端队列)使用:

方法

描述

addFirst(E e) / offerFirst(E e)

添加到头部

addLast(E e) / offerLast(E e)

添加到尾部

removeFirst() / pollFirst()

移除并返回头部元素

removeLast() / pollLast()

移除并返回尾部元素

getFirst() / peekFirst()

获取头部元素(不移除)

getLast() / peekLast()

获取尾部元素(不移除)


🛠️ 三、实际应用场景与示例

1. 模拟队列(Queue)

代码语言:java
复制
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
        }
    }
}

2. 模拟栈(Stack)

代码语言:java
复制
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
        }
    }
}

3. 实现 LRU 缓存(部分逻辑)

LinkedList 可以配合 HashMap 来实现简单的 LRU 缓存机制(虽然更高效的是用 LinkedHashMap)。

代码语言:java
复制
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

操作

ArrayList

LinkedList

插入/删除(开头)

O(n)

O(1)

插入/删除(中间)

O(n)

O(n)(需要遍历)

插入/删除(结尾)

O(1)*

O(1)

随机访问

O(1)

O(n)

内存占用

较低

较高(每个节点有前后指针)

*扩容时为 O(n)


🎯 五、适用场景总结

场景

推荐使用 LinkedList 吗?

高频插入/删除

✅ 强烈推荐

需要模拟栈或队列

✅ 推荐

高频随机访问

❌ 不推荐

节省内存

❌ 不推荐

实现 LRU 缓存

✅ 可以,但建议使用 LinkedHashMap 更高效


💡 六、小贴士

  • 如果你只是需要一个动态数组,优先考虑 ArrayList
  • 如果你需要频繁地从头部或尾部插入/删除元素LinkedList 更合适。
  • 如果你需要线程安全的链表,请使用 Collections.synchronizedList(new LinkedList<>()) 或使用并发集合如 ConcurrentLinkedDeque

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🧱 一、Java LinkedList 的基本特点
  • 📚 二、常用方法说明
    • ✅ 作为 List 使用:
    • ✅ 作为 Deque(双端队列)使用:
  • 🛠️ 三、实际应用场景与示例
    • 1. 模拟队列(Queue)
    • 2. 模拟栈(Stack)
    • 3. 实现 LRU 缓存(部分逻辑)
  • ⚙️ 四、性能对比:ArrayList vs LinkedList
  • 🎯 五、适用场景总结
  • 💡 六、小贴士
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档