LinkedHashMap 是 Map 介面的雜湊表與鏈結串列雙重實作,最大特色在於擁有可預期的迭代順序。這與 HashMap 形成鮮明對比:HashMap 的迭代順序雜亂無章,而 LinkedHashMap 內部維護一條雙向鏈結串列,預設依照「鍵值插入順序」進行迭代。
put(k, v),原順序保持不變(JDK 文件明確說明)。package collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
public class Lession14LinkedHashMap {
public static void main(String[] args) {
// 相同資料分別測試兩種 Map
testMap(new HashMap()); // 順序不可預測
testMap(new LinkedHashMap()); // 嚴格遵循插入順序
// 刪除後再插入:LinkedHashMap 會移至末尾,HashMap 可能復用空位
}
public static void testMap(Map map) {
// 插入 98~102
for (int i = 98; i <= 102; i++) {
map.put(i, i);
}
showMap(map);
// 嘗試重複插入 100
map.put(100, 100);
showMap(map);
// 刪除 100 再重新插入
map.remove(100);
map.put(100, 100);
showMap(map);
}
public static void showMap(Map map) {
Iterator it = map.keySet().iterator();
Object key;
while (it.hasNext()) {
key = it.next();
System.out.print(key + "=>" + map.get(key) + "; ");
}
System.out.println();
}
}
程式輸出清晰展示了差異:
102=>102; 100=>100; 101=>101; 98=>98; 99=>99;),每次執行可能不同。98=>98; 99=>99; 100=>100; 101=>101; 102=>102;。put(100, 100) 時,LinkedHashMap 順序不變。remove(100) 後再 put(100, 100),LinkedHashMap 將該條目移至鏈結串列末尾,順序變為 98, 99, 101, 102, 100;而 HashMap 可能復用原位置。accessOrder 參數)。LinkedHashMap 以極低額外成本(雙向鏈結串列)解決了 HashMap 順序不可預測的問題,是「需要順序又不想付出排序成本」時的首選。掌握其「插入順序」與「存取順序」兩種模式,能讓你在快取、資料處理等場景遊刃有餘。