22.九种Map的遍历方式

通过 entrySet 来遍历

1、通过 for 和 map.entrySet() 来遍历

第一种方式是采用 for 和 Map.Entry 的形式来遍历,通过遍历 map.entrySet() 获取每个 entry 的 key 和 value,代码如下。这种方式一般也是阿粉使用的比较多的一种方式,没有什么花里胡哨的用法,就是很朴素的获取 map 的 key 和 value

1 public static void testMap1(Map<Integer, Integer> map) {
2     long sum = 0;
3     for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
4       sum += entry.getKey() + entry.getValue();
5     }
6     System.out.println(sum);
7   }

看过 HashMap 源码的同学应该会发现,这个遍历方式在源码中也有使用,如下图所示,

 

 

 putMapEntries 方法在我们调用 putAll 方法的时候会用到。

 

 

2、通过 for, Iterator 和 map.entrySet() 来遍历

我们第一个方法是直接通过 for 和 entrySet() 来遍历的,这次我们使用 entrySet() 的迭代器来遍历,代码如下。

1 public static void testMap2(Map<Integer, Integer> map) {
2     long sum = 0;
3     for (Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); entries.hasNext(); ) {
4       Map.Entry<Integer, Integer> entry = entries.next();
5       sum += entry.getKey() + entry.getValue();
6     }
7     System.out.println(sum);
8   }

3、通过 whileIterator  和 map.entrySet() 来遍历

上面的迭代器是使用 for 来遍历,那我们自然可以想到还可以用 while 来进行遍历,所以代码如下所示。

1  public static void testMap3(Map<Integer, Integer> map) {
2     Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
3     long sum = 0;
4     while (it.hasNext()) {
5       Map.Entry<Integer, Integer> entry = it.next();
6       sum += entry.getKey() + entry.getValue();
7     }
8     System.out.println(sum);
9   }

这种方法跟上面的方法类似,只不过循环从 for 换成了 while,日常我们在开发的时候,很多场景都可以将 for 和 while 进行替换。2 和 3 都使用迭代器 Iterator,通过迭代器的 next(),方法来获取下一个对象,依次判断是否有 next

通过 keySet 来遍历

上面的这三种方式虽然代码的写法不同,但是都是通过遍历 map.entrySet() 来获取结果的,殊途同归。接下来我们看另外的一组。

4、通过 for 和 map.keySet() 来遍历

前面的遍历是通过 map.entrySet() 来遍历,这里我们通过 map.keySet() 来遍历,顾名思义前者是保存 entry 的集合,后者是保存 key 的集合,遍历的代码如下,因为是 key 的集合,所以如果想要获取 key 对应的 value 的话,还需要通过 map.get(key) 来获取。

1 public static void testMap4(Map<Integer, Integer> map) {
2     long sum = 0;
3     for (Integer key : map.keySet()) {
4       sum += key + map.get(key);
5     }
6     System.out.println(sum);
7   }

5、通过 forIterator 和 map.keySet() 来遍历

1 public static void testMap5(Map<Integer, Integer> map) {
2     long sum = 0;
3     for (Iterator<Integer> key = map.keySet().iterator(); key.hasNext(); ) {
4       Integer k = key.next();
5       sum += k + map.get(k);
6     }
7     System.out.println(sum);
8   }

6、通过 whileIterator 和 map.keySet() 来遍历

1 public static void testMap6(Map<Integer, Integer> map) {
2     Iterator<Integer> it = map.keySet().iterator();
3     long sum = 0;
4     while (it.hasNext()) {
5       Integer key = it.next();
6       sum += key + map.get(key);
7     }
8     System.out.println(sum);
9   }

我们可以看到这种方式相对于 map.entrySet() 方式,多了一步 get 的操作,这种场景比较适合我们只需要 key 的场景,如果也需要使用 value 的场景不建议使用 map.keySet() 来进行遍历,因为会多一步 map.get() 的操作。

Java 8 的遍历方式

注意下面的几个遍历方法都是是 JDK 1.8 引入的,如果使用的 JDK 版本不是 1.8 以及之后的版本的话,是不支持的。

7、通过 map.forEach() 来遍历

JDK 中的 forEach 方法,使用率也挺高的。

1 public static void testMap7(Map<Integer, Integer> map) {
2     final long[] sum = {0};
3     map.forEach((key, value) -> {
4       sum[0] += key + value;
5     });
6     System.out.println(sum[0]);
7   }

该方法被定义在 java.util.Map#forEach 中,并且是通过 default 关键字来标识的,如下图所示。这里提个问题,为什么要使用 default 来标识呢?欢迎把你的答案写在评论区。

8、Stream 遍历

1 public static void testMap8(Map<Integer, Integer> map) {
2     long sum = map.entrySet().stream().mapToLong(e -> e.getKey() + e.getValue()).sum();
3     System.out.println(sum);
4   }

9、ParallelStream 遍历

1  public static void testMap9(Map<Integer, Integer> map) {
2     long sum = map.entrySet().parallelStream().mapToLong(e -> e.getKey() + e.getValue()).sum();
3     System.out.println(sum);
4   }

这两种遍历方式都是 JDK 8 的 Stream 遍历方式,stream 是普通的遍历,parallelStream 是并行流遍历,在某些场景会提升性能,但是也不一定

 

 

 

 

 

 

 

posted @ 2022-11-25 02:43  midiyu  阅读(151)  评论(0编辑  收藏  举报