Java LinkedHashMap

LinkedHashMapHashMap 的子類別,維護元素的插入順序或存取順序。

引入套件

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

特性HashMapLinkedHashMap
順序無序維護順序
效能稍快稍慢
記憶體較少較多
迭代順序不可預測可預測

重點整理

  • LinkedHashMap 維護插入順序或存取順序
  • 繼承自 HashMap,具有相同的基本操作
  • accessOrder=true 可用於實作 LRU 快取
  • 覆寫 removeEldestEntry() 可自動移除舊元素
  • HashMap 稍慢,但保持順序