java hashmap 通过 foreach 遍历需要调用 map 实例的 foreach 方法,并传入一个实现 biconsumer super k, ? super v> 接口的 lambda 表达式作为参数。该方法会按内部哈希表的存储顺序依次访问每个键值对,并在回调中执行指定的逻辑。若需修改 map 内容或依赖特定迭代顺序,应改用其他遍历方式。

如何获取遍历中的键和值
在 Lambda 表达式中直接定义两个参数即可分别接收键和值。这两个参数的类型与 Map 的泛型定义一致,开发者可以在表达式体内直接使用它们进行打印、计算或过滤操作。

import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
// 使用 forEach 遍历
map.forEach((key, value) -> {
System.out.println("Key: " + key + ", Value: " + value);
});
}
}
运行上述代码将输出:
立即学习“Java免费学习笔记(深入)”;
Key: A, Value: 1 Key: B, Value: 2
遍历时修改 Map 会发生什么
如果在 forEach 的回调函数中尝试向 Map 中添加或删除元素,会抛出 ConcurrentModificationException。这是因为 forEach 依赖于内部迭代器,而结构修改会破坏迭代器的预期状态。若需过滤或转换数据,应先收集结果再更新原 Map。

import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
try {
map.forEach((key, value) -> {
if (value == 1) {
map.remove(key); // 触发异常
}
});
} catch (Exception e) {
System.out.println("Error: " + e.getClass().getSimpleName());
}
}
}
运行结果将显示:
Error: ConcurrentModificationException
基于输入条件判断遍历行为
当 Map 中包含重复键时,后插入的值会覆盖先前的值,因此 forEach 只会输出最终保留的键值对。例如,若先 put("X", 10) 再 put("X", 20),遍历时仅能看到 "X" 对应 20。这体现了 HashMap 键唯一性的底层机制。


















