首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 進階教學(14):認識 LinkedHashMap —— 保有插入順序的 Map 實作

     編輯:Java 相關知識

LinkedHashMap 是 Map 介面的雜湊表與鏈結串列雙重實作,最大特色在於擁有可預期的迭代順序。這與 HashMap 形成鮮明對比:HashMap 的迭代順序雜亂無章,而 LinkedHashMap 內部維護一條雙向鏈結串列,預設依照「鍵值插入順序」進行迭代。

核心特性

  • 繼承自 HashMap,擁有其所有特性(非同步、允許 null 鍵/值等)。
  • 內部維護雙向鏈結串列,記錄條目插入順序。
  • 重複插入相同 Key 不影響順序:若對已存在的 Key 呼叫 put(k, v),原順序保持不變(JDK 文件明確說明)。
  • 避免 HashMap 的混亂順序,又無 TreeMap 的排序額外成本(TreeMap 需維護紅黑樹,效能較低)。
  • 可輕易產生「與原映射插入順序相同」的副本,且不依賴原映射實作類別。

程式碼示範:HashMap vs LinkedHashMap

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();
    }
}

執行結果解析

程式輸出清晰展示了差異:

  • HashMap:順序雜亂(如 102=>102; 100=>100; 101=>101; 98=>98; 99=>99;),每次執行可能不同。
  • LinkedHashMap:嚴格按插入順序 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 可能復用原位置。

應用場景

  • 需要保留資料輸入順序的快取實作(如 LRU 快取,配合 accessOrder 參數)。
  • 輸出報表、序列化輸出時需固定順序。
  • 任何「順序有語意」的 Key-Value 儲存需求。

小結

LinkedHashMap 以極低額外成本(雙向鏈結串列)解決了 HashMap 順序不可預測的問題,是「需要順序又不想付出排序成本」時的首選。掌握其「插入順序」與「存取順序」兩種模式,能讓你在快取、資料處理等場景遊刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved