一、Map 集合遍历的核心思路
Map 集合与 List、Set 等单列集合不同,它存储的是键值对映射关系,因此遍历的核心是获取键和对应的值。常见的遍历思路有两种:
- 先获取所有键,再通过键找对应的值(键找值法)
- 直接获取所有键值对对象,再从对象中提取键和值(键值对法)
二、具体遍历方式及代码实现
以HashMap<String, String>为例,先初始化一个包含数据的 Map:
java
Map<String, String> map = new HashMap<>();
map.put("1", "2");
map.put("3", "4");
map.put("5", "6");
方式一:键找值法(通过 keySet () 实现)
原理:
- 调用
map.keySet()方法,获取所有键(Key)组成的Set集合 - 遍历该
Set集合,得到每个键 - 通过
map.get(key)方法,根据键获取对应的值(Value)
该方式支持三种遍历实现:增强 for 循环、迭代器、Lambda 表达式。
1. 增强 for 循环遍历
java
// 1.获取所有键的Set集合
Set<String> keys = map.keySet();
// 2.增强for循环遍历键集合
for (String key : keys) {
String value = map.get(key);
System.out.println(key + "=" + value);
}
2. 迭代器遍历
java
// 1.获取所有键的Set集合
Set<String> keys = map.keySet();
// 2.获取迭代器
Iterator<String> it = keys.iterator();
// 3.迭代遍历
while (it.hasNext()) {
String key = it.next();
String value = map.get(key);
System.out.println(key + "=" + value);
}
3. Lambda 表达式遍历
利用Set集合的forEach方法,结合 Lambda 表达式简化代码:
java
// 1.获取所有键的Set集合
Set<String> keys = map.keySet();
// 2.Lambda遍历
keys.forEach(key -> {
String value = map.get(key);
System.out.println(key + "=" + value);
});
方式二:键值对法(通过 entrySet () 实现)
原理:
- 调用
map.entrySet()方法,获取所有键值对(Map.Entry)组成的Set集合(Entry是 Map 的内部接口,代表一个键值对) - 遍历该
Set集合,得到每个Entry对象 - 通过
entry.getKey()和entry.getValue()直接获取键和值
该方式同样支持三种遍历实现,且效率通常高于键找值法(无需多次调用get()方法)。
1. 增强 for 循环遍历
java
// 1.获取所有键值对的Set集合
Set<Map.Entry<String, String>> entries = map.entrySet();
// 2.增强for循环遍历键值对集合
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println("key=" + key + ", value=" + value);
}
2. 迭代器遍历
java
// 1.获取所有键值对的Set集合
Set<Map.Entry<String, String>> entries = map.entrySet();
// 2.获取迭代器
Iterator<Map.Entry<String, String>> it = entries.iterator();
// 3.迭代遍历
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println("key=" + key + ", value=" + value);
}
3. Lambda 表达式遍历
java
// 1.获取所有键值对的Set集合
Set<Map.Entry<String, String>> entries = map.entrySet();
// 2.Lambda遍历
entries.forEach(entry -> {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "=" + value);
});
Map.forEach () 方法
Java 8 之后,Map 接口直接提供了forEach方法,可更简洁地遍历:
java
map.forEach((key, value) -> {
System.out.println(key + "=" + value);
});
Stream API 遍历
结合流的操作(如过滤、映射等)实现更灵活的遍历。
java
Map<String, String> map = new HashMap<>();
map.put("1", "2");
map.put("3", "4");
map.put("5", "6");
// 通过entrySet获取流,遍历所有键值对
map.entrySet().stream()
.forEach(entry -> {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "=" + value);
});
// 结合过滤操作(例如只打印键为偶数的键值对)
map.entrySet().stream()
.filter(entry -> Integer.parseInt(entry.getKey()) % 2 == 0)
.forEach(entry -> System.out.println("过滤后:" + entry.getKey() + "=" + entry.getValue()));
特点:
- 支持链式操作(过滤、映射、排序等),适合复杂业务场景
- 代码简洁,功能强大,是 Java 8 + 推荐的高级遍历方式
- 本质是对
entrySet的流式处理,可看作entrySet遍历的增强版