Java 遍历 Map 的常用方式与性能对比
在 Java 开发中,Map 是数据结构的核心组件之一。从早期的 Iterator 到 Java 5 引入的 foreach,再到 Java 8 的 Lambda 表达式,遍历方式不断演进。作为开发者,了解每种方式的适用场景和性能差异至关重要。
首先,我们需要一个基础的数据结构来演示。这里定义一个静态 Map 用于后续测试:
public class TestMap {
public static Map<Integer, Integer> map = new HashMap<>();
static {
for (int i = 0; i < 100000; i++) {
map.put(i, 1);
}
}
}
1. 仅获取 Key 或 Value
如果业务逻辑只需要单独处理键或值,直接调用 keySet() 或 values() 是最直观的选择。
// 遍历 Key
for (Integer key : map.keySet()) {
System.out.println(key);
}
// 遍历 Value
for (Integer value : map.values()) {
System.out.println(value);
}
2. 同时获取 Key 和 Value
这是最常见的场景。虽然可以通过 keySet() 配合 get(key) 实现,但这并非最优解,因为每次 get 操作都涉及哈希查找,整体复杂度较高。
推荐使用 entrySet(),它直接返回键值对的视图,性能更稳定:
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
3. 遍历时修改集合
foreach 循环在遍历过程中修改 Map 大小(如添加或删除)会抛出 ConcurrentModificationException。此时 Iterator 是更安全的选择,它提供了安全的 remove() 方法:
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, Integer> entry = it.next();
// it.remove(); // 安全删除元素
}

