Java LinkedHashMap
LinkedHashMap 是 HashMap 的子類別,維護元素的插入順序或存取順序。
引入套件
import java.util.LinkedHashMap;
建立 LinkedHashMap
// 維護插入順序(預設)
LinkedHashMap<String, Integer> map1 = new LinkedHashMap<>();
// 維護存取順序
LinkedHashMap<String, Integer> map2 = new LinkedHashMap<>(16, 0.75f, true);
// 參數:初始容量, 負載因子, accessOrder(true=存取順序)
基本操作
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
// 新增
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Cherry", 3);
// 迭代會按插入順序
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// Apple: 1
// Banana: 2
// Cherry: 3
存取順序模式
// accessOrder = true
LinkedHashMap<String, Integer> map = new LinkedHashMap<>(16, 0.75f, true);
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
// 存取 A
map.get("A");
// A 會移到最後(最近存取)
System.out.println(map.keySet()); // [B, C, A]
實作 LRU 快取
public 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<String, String> cache = new LRUCache<>(3);
cache.put("A", "1");
cache.put("B", "2");
cache.put("C", "3");
cache.get("A"); // 存取 A
cache.put("D", "4"); // 超過容量,移除最久未用的 B
System.out.println(cache.keySet()); // [C, A, D]
HashMap vs LinkedHashMap
| 特性 | HashMap | LinkedHashMap |
|---|---|---|
| 順序 | 無序 | 維護順序 |
| 效能 | 稍快 | 稍慢 |
| 記憶體 | 較少 | 較多 |
| 迭代順序 | 不可預測 | 可預測 |
重點整理
LinkedHashMap維護插入順序或存取順序- 繼承自
HashMap,具有相同的基本操作 accessOrder=true可用於實作 LRU 快取- 覆寫
removeEldestEntry()可自動移除舊元素 - 比
HashMap稍慢,但保持順序