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

Java Map 九大高頻問題實戰指南:轉 List、排序、不可變、淺拷貝與雙向查找

     編輯:Java 綜合教學

Java Map 九大高頻問題實戰指南:轉 List、排序、不可變、淺拷貝與雙向查找

Map 是日常開發最高頻的集合之一。本文匯總 9 個實戰高頻場景:Map 轉 List、高效遍歷、按 Key/Value 排序、構建不可變 Map、三大實現類對比、雙向查找、淺拷貝陷阱、創建空 Map,附代碼最佳實踐。

1. Map → List 三種視圖

List<K> keyList = new ArrayList<>(map.keySet());
List<V> valueList = new ArrayList<>(map.values());
List<Map.Entry<K,V>> entryList = new ArrayList<>(map.entrySet());

2. 高效遍歷 EntrySet(推薦)

for (Map.Entry<K, V> entry : map.entrySet()) {
    K key = entry.getKey();
    V value = entry.getValue();
}

3. 按 Key 排序:TreeMap + Comparator

SortedMap<K, V> sorted = new TreeMap<>((k1, k2) -> k1.compareTo(k2));
sorted.putAll(map);

4. 按 Value 排序:EntryList + Comparator

List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
list.sort((e1, e2) -> e1.getValue().compareTo(e2.getValue()));

Value 不唯一時無法直接用 SortedMap 反轉 Key/Value。

5. 構建不可變 Map(線程安全)

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

6. HashMap vs TreeMap vs Hashtable

特性HashMapTreeMapHashtable
有序性無序按 Key 自然序/Comparator 有序無序
Null Key允許一個自然序不允許,Comparator 視實現不允許
Null Value允許允許不允許
線程安全否否是(synchronized)
推薦場景高性能單線程需排序遍歷舊代碼兼容,新代碼用 ConcurrentHashMap

7. 雙向查找 Map(BiMap)

JDK 無內置,使用 Guava BiMap 或 Apache Commons BidiMap,要求 Key-Value 一對一唯一。

8. 淺拷貝線程安全陷阱

  • 構造器拷貝 new HashMap(old) 非同步
  • 解決:Map<K,V> safe = Collections.synchronizedMap(new HashMap<>(old))
  • clone() 不推薦(Josh Bloch 指出 Cloneable 設計缺陷)

9. 創建空 Map

// 不可變空 Map
Map<K,V> empty = Collections.emptyMap();
// 可變空 Map
Map<K,V> mutable = new HashMap<>();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved