Map map = new HashMap<>();
// ... put data ...
for (Iterator> it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry entry = it.next();
String key = entry.getKey();
Object val = entry.getValue();
// 處理 key/val
}
✅ 單次遍歷同時取得 key/value,無額外 get() 查找。
for (Iterator it = map.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
Object val = map.get(key); // 額外 hash 查找
}
⚠️ 兩次查找:一次 iterator,一次 get(),效能較差。
// entrySet 版
for (Map.Entry entry : map.entrySet()) {
String key = entry.getKey();
Object val = entry.getValue();
}
// keySet 版
for (String key : map.keySet()) {
Object val = map.get(key);
}
語法糖,編譯後同 Iterator,可讀性最佳。
| 遍歷方式 | 相對耗時 (100萬筆) | 備註 |
|---|---|---|
| entrySet + for-each | 1.0x (基準) | 最佳平衡 |
| entrySet + Iterator | 1.05x | 同級 |
| keySet + for-each | 1.35x | 額外 get() |
| forEach (Java 8) | 1.1x | Lambda 開銷 |
// Lambda
map.forEach((k, v) -> System.out.println(k + "=" + v));
// Stream 平行處理大量資料
map.entrySet().parallelStream().forEach(entry -> {
// 多執行緒處理
});
entrySet 遍歷,避免 keySet + get() 雙重查找。keySet() 或 values() 更語意清晰。Iterator.remove(),直接呼叫 map.remove() 會拋 ConcurrentModificationException。ConcurrentHashMap,其 forEach 為弱一致性遍歷,不拋異常。