22.九种Map的遍历方式
通过 entrySet
来遍历
1、通过 for
和 map.entrySet()
来遍历
第一种方式是采用 for
和 Map.Entry
的形式来遍历,通过遍历 map.entrySet()
获取每个 entry
的 key
和 value
,代码如下。这种方式一般也是阿粉使用的比较多的一种方式,没有什么花里胡哨的用法,就是很朴素的获取 ma
p 的 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、通过 while
,Iterator
和 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、通过 for
,Iterator
和 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、通过 while
,Iterator
和 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
是并行流遍历,在某些场景会提升性能,但是也不一定