四種遍歷模式
Map map = new HashMap<>();
map.put("1", "第一個數");
map.put("2", "第二個數");
map.put("3", "第三個數");
1. keySet + Iterator(經典)
for (Iterator it = map.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
String value = map.get(key);
}
2. entrySet + Iterator(推薦單線程)
for (Iterator> it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry e = it.next();
String key = e.getKey();
String value = e.getValue();
}
3. keySet + 增強 for(語法糖)
for (String key : map.keySet()) {
String value = map.get(key);
}
4. entrySet + 增強 for(最佳性能)
for (Map.Entry e : map.entrySet()) {
String key = e.getKey();
String value = e.getValue();
}
性能與適用性對比
| 方式 | 鍵查找次數 | 可讀性 | 線程安全 | 推薦場景 |
| keySet + Iterator | N 次 get() | 中 | 需手動同步 | 需刪除鍵時 |
| entrySet + Iterator | 0 次 | 中 | 需手動同步 | 只讀遍歷、需刪除 |
| keySet + for-each | N 次 get() | 高 | 不可修改結構 | 簡單只讀 |
| entrySet + for-each | 0 次 | 高 | 不可修改結構 | 通用最佳 |
JDK 8+ 函數式遍歷
map.forEach((k, v) -> System.out.println(k + "=" + v));
// 並行遍歷(大數據量)
map.entrySet().parallelStream().forEach(e -> ...);
並發環境最佳實踐
ConcurrentHashMap:forEach、forEachEntry 線程安全,弱一致性迭代器
- 遍歷期間不加鎖,允許並發修改
- 需強一致性:鎖定整個 Map 或複製快照遍歷
常見陷阱
- for-each 循環中調用
map.remove(key) → ConcurrentModificationException
HashMap 非線程安全,多線程寫入導致死循環或數據丟失
entrySet 視圖隨 Map 變化,遍歷時勿修改結構
- 上一篇文章: Java IO 體系演進:1.0 字節流與 1.1 字符流對比全解析
- 下一篇文章: 為什麼重寫 equals 必須重寫 hashCode?契約、哈希表原理與最佳實踐
Copyright ©
程式碼之家 All Rights Reserved