Map 以鍵值對儲存資料,鍵唯一。本文整理九大實戰高頻問題,附代碼範例與效能考量。
List keyList = new ArrayList<>(map.keySet());
List valueList = new ArrayList<>(map.values());
List> entryList = new ArrayList<>(map.entrySet());
// 推薦:單次查找同時取得 key/value
for (Map.Entry entry : map.entrySet()) {
K key = entry.getKey();
V value = entry.getValue();
}
// JDK 1.5 前用 Iterator 同理
Collections.sort() + Comparator 比較 e1.getKey()TreeMap(需 Key 實作 Comparable 或提供 Comparator)SortedMap sorted = new TreeMap<>(map); (構造函式自動複製並排序)
List> list = new ArrayList<>(map.entrySet());
list.sort(Comparator.comparing(Map.Entry::getValue)); // Java 8+
// 或舊版 Comparator 匿名類別比較 e1.getValue()
// 錯誤示範: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
| 特性 | HashMap | TreeMap | Hashtable |
|---|---|---|---|
| 順序 | 無序 | Key 自然序/Comparator 序 | 無序 |
| Null Key/Value | 允許 | Key 不允許 null | 不允許 |
| 執行緒安全 | 否 | 否 | 是(同步方法,效能差) |
| 迭代器 | Fail-fast | Fail-fast | Enumeration(非 fail-fast) |
| 推薦場景 | 單執行緒、高效能 | 需有序遍歷 | 遺留代碼,新代碼用 ConcurrentHashMap |
JDK 無內建。Apache Commons Collections BidiMap、Guava BiMap 提供 1:1 雙向映射,雙向皆唯一。
Map syncMap = Collections.synchronizedMap(map); (方法級同步,迭代需手動同步)Collections.unmodifiableMap(map)new HashMap<>(map)(淺拷貝,Value 物件共享)clone(),偏好拷貝建構子或靜態工廠方法。
// 不可變空 Map(共享單例,零開銷)
Map empty = Collections.emptyMap();
// 可變空 Map
Map mutable = new HashMap<>();
initialCapacity,避免擴容重雜湊(new HashMap<>(expectedSize * 4/3))。hashCode()/equals()。Map map = new HashMap<>(); 。Collections.emptyMap() 或長度 0 陣列,不要回傳 null。ConcurrentHashMap,不要手動同步 HashMap。