Map 是 Java 集合框架核心接口,遍歷方式主要分為基於鍵集合與基於鍵值對集合兩大類,各衍生出傳統迭代器與增強 for 循環兩種寫法,共四種常見模式。
Map<String, String> map = new HashMap<>();
map.put("1", "第一個");
map.put("2", "第二個");
map.put("3", "第三個");
Set<String> keySet = map.keySet();
Iterator<String> it = keySet.iterator();
while (it.hasNext()) {
String key = it.next();
String value = map.get(key);
System.out.println(key + "=" + value);
}
特點:需兩次查找(取鍵再取值),效率略低;可在遍歷中安全移除鍵(it.remove())。
Set<Map.Entry<String, String>> entrySet = map.entrySet();
Iterator<Map.Entry<String, String>> it = entrySet.iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println(entry.getKey() + "=" + entry.getValue());
}
特點:單次獲取鍵值對,無需額外 get(),性能最優;亦可安全移除。
for (String key : map.keySet()) {
String value = map.get(key);
System.out.println(key + "=" + value);
}
特點:語法簡潔,但同樣存在雙重查找開銷;不可在循環中修改 Map 結構,否則拋 ConcurrentModificationException。
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
特點:兼具可讀性與性能,無額外查找;同樣禁止結構性修改。
map.forEach((k, v) -> System.out.println(k + "=" + v));
// 或流式處理
map.entrySet().stream()
.forEach(e -> System.out.println(e.getKey() + "=" + e.getValue()));
內部實現基於 entrySet 迭代器,語義更清晰,支持鏈式操作(過濾、轉換等)。
| 方法 | 性能 | 可讀性 | 可修改結構 | 推薦場景 |
|---|---|---|---|---|
| keySet + Iterator | 中 | 低 | 是 (it.remove) | 需邊遍歷邊刪除鍵 |
| entrySet + Iterator | 高 | 中 | 是 (it.remove) | 高性能且需刪除 |
| keySet + for-each | 中 | 高 | 否 | 僅讀遍歷、鍵值均需用 |
| entrySet + for-each | 高 | 高 | 否 | 日常唯讀遍歷首選 |
| forEach + Lambda | 高 | 最高 | 否 | Java 8+、需函數式處理 |
entrySet + 增強 for 或 forEach。Iterator.remove(),推薦 entrySet 版本。keySet 足矣。