Map 遍歷是日常開發高頻操作。本文對比三種主流寫法的語法、效能、適用場景,並給出最佳實務建議。
Map map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
// 僅需 Key 時
for (String key : map.keySet()) {
System.out.println(key);
}
// 需 Key+Value:兩次查找,效能較差
for (String key : map.keySet()) {
Object val = map.get(key); // 額外 hash 查找
System.out.println(key + "=" + val);
}
// Java 8+ Lambda
map.forEach((k, v) -> System.out.println(k + "=" + v));
// 傳統 for-each
for (Map.Entry entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
// 需修改 Value
for (Map.Entry entry : map.entrySet()) {
entry.setValue(entry.getValue() + "_new");
}
Iterator> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = it.next();
System.out.println(entry.getKey() + "=" + entry.getValue());
// 安全刪除
if (entry.getValue().equals("removeMe")) {
it.remove();
}
}
| 寫法 | 相對耗時 (ns/op) | 備註 |
|---|---|---|
| entrySet for-each | 1.0x | 基準,最快 |
| forEach Lambda | 1.1x | 極微小開銷 |
| keySet + get | 1.8x | 雙重查找 |
| Iterator | 1.05x | 與 entrySet 相近 |
ConcurrentModificationException。Map syncMap = Collections.synchronizedMap(new HashMap<>());
synchronized (syncMap) {
for (Map.Entry e : syncMap.entrySet()) {
// ...
}
}
// 過濾並轉 List
List keys = map.entrySet().stream()
.filter(e -> e.getValue() instanceof Integer)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
// 分組統計
Map
entrySet for-each 或 forEach Lambda。Iterator.remove() 或 removeIf(Java 8)。keySet()。ConcurrentHashMap 弱一致性迭代器。