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

Java Map 九大高頻問題全解析:轉 List、排序、雙向查詢、執行緒安全與最佳實踐

     編輯:Java 相關知識

前言:Map 是 Java 開發者的日常瑞士刀

Map 以鍵值對儲存資料,鍵唯一。本文整理九大實戰高頻問題,附代碼範例與效能考量。

0. Map 轉 List 三種視圖


List keyList = new ArrayList<>(map.keySet());
List valueList = new ArrayList<>(map.values());
List> entryList = new ArrayList<>(map.entrySet());

1. 高效遍歷:entrySet()


// 推薦:單次查找同時取得 key/value
for (Map.Entry entry : map.entrySet()) {
    K key = entry.getKey();
    V value = entry.getValue();
}
// JDK 1.5 前用 Iterator 同理

2. 依 Key 排序

  • 方案 A:轉 List + Collections.sort() + Comparator 比較 e1.getKey()
  • 方案 B:直接用 TreeMap(需 Key 實作 Comparable 或提供 Comparator)
    SortedMap sorted = new TreeMap<>(map);(構造函式自動複製並排序)

3. 依 Value 排序


List> list = new ArrayList<>(map.entrySet());
list.sort(Comparator.comparing(Map.Entry::getValue)); // Java 8+
// 或舊版 Comparator 匿名類別比較 e1.getValue()

4. 靜態常量 Map:真正不可變


// 錯誤示範:final 只保護引用,內容仍可修改
private static final Map MAP = new HashMap<>();
static { MAP.put(1, "one"); }

// 正確:Collections.unmodifiableMap 包裝
private static final Map MAP;
static {
    Map tmp = new HashMap<>();
    tmp.put(1, "one");
    MAP = Collections.unmodifiableMap(tmp);
}
// MAP.put(2, "two") → 拋出 UnsupportedOperationException

5. 三大實作選型:HashMap vs TreeMap vs Hashtable

特性HashMapTreeMapHashtable
順序無序Key 自然序/Comparator 序無序
Null Key/Value允許Key 不允許 null不允許
執行緒安全否否是(同步方法,效能差)
迭代器Fail-fastFail-fastEnumeration(非 fail-fast)
推薦場景單執行緒、高效能需有序遍歷遺留代碼,新代碼用 ConcurrentHashMap

6. 雙向查詢

JDK 無內建。Apache Commons Collections BidiMap、Guava BiMap 提供 1:1 雙向映射,雙向皆唯一。

7. Map 複製與同步

  • 同步視圖:Map syncMap = Collections.synchronizedMap(map);(方法級同步,迭代需手動同步)
  • 不可變視圖:Collections.unmodifiableMap(map)
  • 深拷貝:new HashMap<>(map)(淺拷貝,Value 物件共享)
  • Josh Bloch 建議:避免 clone(),偏好拷貝建構子或靜態工廠方法。

8. 建立空 Map


// 不可變空 Map(共享單例,零開銷)
Map empty = Collections.emptyMap();

// 可變空 Map
Map mutable = new HashMap<>();

9. 最佳實踐清單

  1. 預估資料量設定 initialCapacity,避免擴容重雜湊(new HashMap<>(expectedSize * 4/3))。
  2. Key 使用 不可變物件(String、Integer、自訂 Value Object),正確覆寫 hashCode()/equals()。
  3. 介面型別宣告:Map map = new HashMap<>();。
  4. 空集合回傳 Collections.emptyMap() 或長度 0 陣列,不要回傳 null。
  5. 高併發場景直接用 ConcurrentHashMap,不要手動同步 HashMap。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved