Map 是日常開發最高頻的集合之一。本文匯總 9 個實戰高頻場景:Map 轉 List、高效遍歷、按 Key/Value 排序、構建不可變 Map、三大實現類對比、雙向查找、淺拷貝陷阱、創建空 Map,附代碼最佳實踐。
List<K> keyList = new ArrayList<>(map.keySet()); List<V> valueList = new ArrayList<>(map.values()); List<Map.Entry<K,V>> entryList = new ArrayList<>(map.entrySet());
for (Map.Entry<K, V> entry : map.entrySet()) {
K key = entry.getKey();
V value = entry.getValue();
}
SortedMap<K, V> sorted = new TreeMap<>((k1, k2) -> k1.compareTo(k2)); sorted.putAll(map);
List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet()); list.sort((e1, e2) -> e1.getValue().compareTo(e2.getValue()));
Value 不唯一時無法直接用 SortedMap 反轉 Key/Value。
private static final Map<Integer, String> MAP;
static {
Map<Integer, String> temp = new HashMap<>();
temp.put(1, "one");
temp.put(2, "two");
MAP = Collections.unmodifiableMap(temp);
}
// MAP.put(3, "three") → 拋出 UnsupportedOperationException
| 特性 | HashMap | TreeMap | Hashtable |
|---|---|---|---|
| 有序性 | 無序 | 按 Key 自然序/Comparator 有序 | 無序 |
| Null Key | 允許一個 | 自然序不允許,Comparator 視實現 | 不允許 |
| Null Value | 允許 | 允許 | 不允許 |
| 線程安全 | 否 | 否 | 是(synchronized) |
| 推薦場景 | 高性能單線程 | 需排序遍歷 | 舊代碼兼容,新代碼用 ConcurrentHashMap |
JDK 無內置,使用 Guava BiMap 或 Apache Commons BidiMap,要求 Key-Value 一對一唯一。
new HashMap(old) 非同步Map<K,V> safe = Collections.synchronizedMap(new HashMap<>(old))clone() 不推薦(Josh Bloch 指出 Cloneable 設計缺陷)// 不可變空 Map Map<K,V> empty = Collections.emptyMap(); // 可變空 Map Map<K,V> mutable = new HashMap<>();