好的,阿杰 😃,下面我给你写一份 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?
发表回复