本文已参与「新人创作礼」活动,一起开启掘金创作之路。
在 Java 中遍历 Map 有多种方法,既然 Java 中的所有 map 都实现了 Map 接口,以下方法适用于任何 map 实现(HashMap,TreeMap,LinkedHashMap,Hashtable 等等)。
一、遍历 Map 的几种方法
- 在 for 循环中使用 entrySet 遍历 key 和 value,在键和值都需要时使用(最常用)。
- 在 for 循环中使用 keySet 或 values 遍历 map 中的 key 或者 value,一般适用于只需要 map 中的 key 或者 value 的场景。也可以通过 keySet 先得到 key 值,然后通过 key 值得到 value 值。
- 通过 Map.entrySet 使用迭代器 Iterator 遍历 key 和 value。
- java8 Lambda 表达式,可以同时拿到 key 和 value。
几种方式的 Java 实现代码如下所示。
package com.example.demo.test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "第一个");
map.put(2, "第二个");
// 第一种:直接通过 entrySet 遍历 key 和 value,在键和值都需要时使用(最常用)
System.out.println("=========================第一种方法遍历 map==============================================");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println("key = " + entry.getKey() + " ; value = " + entry.getValue());
}
System.out.println("=========================第二种方法遍历 map==============================================");
// 第二种:通过 keySet 或 values 来实现遍历
// 遍历 map 中的键
for (Integer key : map.keySet()) {
System.out.println("key = " + key);
}
// 遍历 map 中的值
for (String value : map.values()) {
System.out.println("value = " + value);
}
// 通过 keySet 先得到 key 值,然后通过 key 值得到 value 值
Set<Integer> set = map.keySet(); // 这里的泛型是 key 值的泛型
for (Integer integer : set) {
System.out.println("key = " + integer + " ; value = " + map.get(integer));
}
System.out.println("=========================第三种方法遍历 map==============================================");
// 第三种:通过 Map.entrySet 使用迭代器 iterator 遍历 key 和 value
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, String> entry = it.next();
System.out.println("key = " + entry.getKey() + " ; value = " + entry.getValue());
if (2 == entry.getKey()) {
it.remove();
}
}
System.out.println("=========================第四种方法遍历 map==============================================");
// 第四种:java8 Lambda 表达式,可以同时拿到 key 和 value
map.forEach((key, value) -> {
System.out.println("key = " + key + " ; value = " + value);
});
}
}
启动测试,输出如下:
=========================第一种方法遍历 map==============================================
key = 1 ; value = 第一个
key = 2 ; value = 第二个
=========================第二种方法遍历 map==============================================
key = 1
key = 2
value = 第一个
value = 第二个
key = 1 ; value = 第一个
key = 2 ; value = 第二个
=========================第三种方法遍历 map==============================================
key = 1 ; value = 第一个
key = 2 ; value = 第二个
=========================第四种方法遍历 map==============================================
key = 1 ; value = 第一个
二、几种遍历方式的使用场景
- 如果同时需要 key 和 value,可以使用 entrySet(第一种或第三种);
- 如果只是获取 key 或者 value,可以使用 keySet 或者 values 方式(第二种);
- 如果需要在遍历过程中删除元素,推荐使用 Iterator(第三种),可以在遍历时调用iterator.remove() 来删除 entry。另两个方法则不能。根据 javadoc 的说明,如果在 for-each 遍历中尝试使用此方法,结果是不可预测的。
- 如果需要在遍历过程中增加元素,可以新建一个临时 map 存放新增的元素,等遍历完毕,再把临时 map 放到原来的 map 中。
三、性能比较
因为笔者并没有亲自测试过各种方法的性能,所以不再详述。网上的测试案例也是结论不一,比较统一的是,普遍认为 entrySet 方法比较快。