Map<String, String> map = new HashMap<>();
map.put("1", "v1");
map.put("2", "v2");
map.put("3", "v3");
for (String key : map.keySet()) {
System.out.println("key=" + key + ", value=" + map.get(key));
}
每次迴圈觸發一次 get() 查找,大數據量下效能稍弱。
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key=" + entry.getKey() + ", value=" + entry.getValue());
}
直接拿到鍵值對,無額外查找,大容量 Map 首選。
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key=" + entry.getKey() + ", value=" + entry.getValue());
// 需刪除時:it.remove(); // 唯一安全刪除方式
}
for (String v : map.values()) {
System.out.println("value=" + v);
}
| 方式 | 適用場景 | 效能 | 可否刪除 |
|---|---|---|---|
| keySet + get | 小 Map、代碼簡潔優先 | O(N) 但常數因子較大 | 否(拋 CME) |
| entrySet (for-each) | 通用遍歷、大 Map | 最優 | 否 |
| entrySet (Iterator) | 遍歷中需刪除 | 最優 | 是 (it.remove()) |
| values() | 只需值 | 最優 | 否 |
map.forEach((k, v) -> System.out.println(k + "=" + v));
map.entrySet().stream()
.filter(e -> e.getKey().startsWith("a"))
.forEach(e -> System.out.println(e.getKey() + "=" + e.getValue()));
結合 Stream API 可表達更複雜的篩選、轉換邏輯。