好的,阿杰 😃,下面我给你写一份 Java 集合之 LinkedHashMap 详解,适合入门和进阶理解:


Java 集合之 LinkedHashMap 详解

1. 概述

  • LinkedHashMap 是 HashMap 的子类。
  • 底层依然是 数组 + 链表 + 红黑树(和 HashMap 一样)。
  • 特点:保持插入顺序,或者根据访问顺序(access-order)排序。

它既能像 HashMap 一样快速查找(O(1) 平均时间复杂度),又能维护元素顺序。


2. 构造方法

// 默认构造,插入顺序
LinkedHashMap<K,V> map = new LinkedHashMap<>();

// 指定容量、负载因子
LinkedHashMap<K,V> map2 = new LinkedHashMap<>(16, 0.75f);

// accessOrder = true 时,按照访问顺序排序
LinkedHashMap<K,V> map3 = new LinkedHashMap<>(16, 0.75f, true);

  • accessOrder = false(默认):保持插入顺序
  • accessOrder = true:每次访问(get/put)后,都会将该键值对移到链表尾部

3. 基本用法

LinkedHashMap<Integer, String> map = new LinkedHashMap<>();

map.put(1, "Java");
map.put(2, "Python");
map.put(3, "C++");

// 按插入顺序遍历
for (Map.Entry<Integer, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}

输出:

1 -> Java
2 -> Python
3 -> C++


4. 按访问顺序排序

LinkedHashMap<Integer, String> lruMap = new LinkedHashMap<>(16, 0.75f, true);

lruMap.put(1, "Java");
lruMap.put(2, "Python");
lruMap.put(3, "C++");

// 访问 key=2
lruMap.get(2);

// 遍历(访问过的 key=2 会排到最后)
System.out.println(lruMap.keySet()); 
// 输出: [1, 3, 2]

👉 这常用于实现 LRU 缓存


5. 实现简单 LRU 缓存

通过重写 removeEldestEntry 方法,当元素超过指定容量时,自动删除最老的元素:

class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int capacity;

    public LRUCache(int capacity) {
        super(capacity, 0.75f, true); // accessOrder = true
        this.capacity = capacity;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > capacity;
    }
}

// 使用
LRUCache<Integer, String> cache = new LRUCache<>(3);
cache.put(1, "A");
cache.put(2, "B");
cache.put(3, "C");
cache.get(1);
cache.put(4, "D"); // 超过容量,移除最早未访问的 key=2

System.out.println(cache.keySet()); // [3, 1, 4]


6. 适用场景

  • 需要 记住插入顺序 的场景
    (如:存储菜单、配置项)
  • 需要 实现 LRU 缓存 的场景
    (利用 accessOrder + removeEldestEntry)

7. 小结

  • LinkedHashMap = HashMap + 有序链表
  • 默认是 插入顺序,可切换为 访问顺序
  • 常用于 有序遍历缓存机制

我已为你整理好了 《Java 集合之 LinkedHashMap 详解》PDF 学习笔记 ✅

你可以在这里下载:
📂 Java_LinkedHashMap_Guide.pdf

要不要我帮你把 HashMap vs LinkedHashMap vs TreeMap 的区别也加进去,做成一份对比版 PDF?