// Key 列表 List<K> keyList = new ArrayList<>(map.keySet()); // Value 列表 List<V> valueList = new ArrayList<>(map.values()); // Entry 列表 (鍵值對) List<Map.Entry<K, V>> entryList = new ArrayList<>(map.entrySet());
// 推薦:單次查找同時取得 Key/Value
for (Map.Entry<K, V> entry : map.entrySet()) {
K key = entry.getKey();
V value = entry.getValue();
}
// Iterator 寫法 (JDK 1.5 風格)
Iterator<Map.Entry<K, V>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<K, V> entry = it.next();
// ...
}
**為何優於 keySet 遍歷?** keySet 需每次 `map.get(key)` 查找,EntrySet 直接持有引用,效能提升明顯。
List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet()); Collections.sort(list, (e1, e2) -> e1.getKey().compareTo(e2.getKey()));
SortedMap<K, V> sortedMap = new TreeMap<>((k1, k2) -> k1.compareTo(k2)); sortedMap.putAll(map);
**注意**:Key 必須實作 `Comparable` 或提供 `Comparator`。
List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet()); Collections.sort(list, (e1, e2) -> e1.getValue().compareTo(e2.getValue()));
同理可用 Lambda 簡化:`Comparator.comparing(Map.Entry::getValue)`
// ❌ 危險:外部仍可修改
public static final Map<String, String> MAP = new HashMap<>();
static { MAP.put("1", "one"); }
Test.MAP.put("3", "three"); // 編譯通過,運行時修改成功!
// ✅ 安全:真正不可變
private static final Map<String, String> MAP;
static {
Map<String, String> temp = new HashMap<>();
temp.put("1", "one");
temp.put("2", "two");
MAP = Collections.unmodifiableMap(temp);
}
// Test.MAP.put("3", "three"); // 拋出 UnsupportedOperationException
| 特性 | HashMap | TreeMap | Hashtable | LinkedHashMap |
|---|---|---|---|---|
| 順序 | 無序 | Key 排序 | 無序 | 插入/存取順序 |
| Null Key | 允許 1 個 | 不允許 | 不允許 | 允許 1 個 |
| Null Value | 允許 | 允許 | 不允許 | 允許 |
| 線程安全 | 否 | 否 | 是 (同步) | 否 |
| 效能 | 最快 | 較慢 (紅黑樹) | 最差 | 略慢於 HashMap |
| 適用場景 | 一般用途 | 需排序 | 舊代碼/線程安全 | 需保持順序 (LRU) |
JDK 無內建,需引入第三方庫:
核心約束:**Key 與 Value 必須一對一唯一對應**。
Map<K, V> copied = new HashMap<>(originalMap);
Map<K, V> syncMap = Collections.synchronizedMap(originalMap);
// 迭代時必須手動同步!
synchronized (syncMap) {
for (V value : syncMap.values()) { ... }
}
Josh Bloch 不推薦 `clone()`:淺拷貝、型別擦除問題、介面契約模糊。**優先使用建構子或 `putAll` 複製。**
// 不可變空 Map (共享單例,零記憶體開銷) Map<K, V> emptyMap = Collections.emptyMap(); // 可變空 Map Map<K, V> mutableMap = new HashMap<>();