;Integer, Integer> map) {
long sum = map.entrySet().parallelStream().mapToLong(e -> e.getKey() + e.getValue()).sum();
System.out.println(sum);
}
这两种遍历方式都是 JDK 8
的 Stream
遍历方式,stream
是普通的遍历,parallelStream
是并行流遍历,在某些场景会提升性能,但是也不一定。
测试代码
上面的遍历方式有了,那么我们在日常开发中到底该使用哪一种呢?每一种的性能是怎么样的呢?为此阿粉这边通过下面的代码,我们来测试一下每种方式的执行时间。
public static void main(String[] args) {
int outSize = 1;
int mapSize = 200;
Map<Integer, Integer> map = new HashMap<>(mapSize);
for (int i = 0; i < mapSize; i++) {
map.put(i, i);
}
System.out.println("---------------start------------------");
long totalTime = 0;
for (int size = outSize; size > 0; size--) {
long startTime = System.currentTimeMillis();
testMap1(map);
totalTime += System.currentTimeMillis() - startTime;
}
System.out.println("testMap1 avg time is :" + (totalTime / outSize));
// 省略其他方法,代码跟上面一致
}
为了避免一些干扰,这里通过外层的 for
来进行多次计算,然后求平均值,当我们的参数分别是 outSize
= 1,mapSize
= 200 的时候,测试的结果如下
当随着我们增大 mapSize
的时候,我们会发现,后面几个方法的性能是逐渐上升的。
总结
从上面的例子来看,当我们的集合数量很少的时候,基本上普通的遍历就可以搞定,不需要使用 JDK 8
的高级 API
来进行遍历,当我们的集合数量较大的时候,就可以考虑采用 JDK 8
的 forEach
或者 Stream
来进行遍历,这样的话效率更高。在普通的遍历方法中 entrySet()
的方法要比使用 keySet()
的方法好。