版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37490221/article/details/82972994
代码如下:
package Common;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @Description 探究Iterator、forEach和forEach()方法遍历的效率
* @Author zaomianbao
* @Date 2018/10/8
**/
public class TestForEach {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
for (int i = 0;i<Integer.parseInt(args[0]);i++){
map.put("a"+i,i);
}
long start = System.nanoTime();
for(Map.Entry<String,Integer> entry : map.entrySet()){}
System.out.println(System.nanoTime()-start);
start = System.nanoTime();
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String,Integer> entry = iterator.next();
}
System.out.println(System.nanoTime()-start);
start = System.nanoTime();
for (String key : map.keySet()){
Integer value = map.get(key);
}
map.entrySet().forEach(entry-> {});
System.out.println(System.nanoTime()-start);
}
}
多次启动主函数,分别携带参数值为:10、100、1000、10000、100000,相同的参数值重复运行5次,获得的打印结果如下
10次:
628253
6436
58975543
455315
6126
76228178
523498
6841
84841845
442094
6915
92031103
366497
8356
59764714
100次:
585780
63333
84507714
664024
64592
68957366
2161189
134513
86621508
595209
62984
114691366
631676
47040
136832860
1000次:
1022002
380109
58950806
1201523
271617
60502112
1549107
935867
103734503
945515
390831
99793278
945515
390831
99793278
10000次:
2747452
1455606
71369223
6688383
4188905
82243723
2814683
1117111
67327629
4780399
1006431
82984210
8786602
2159296
101241859
100000次:
11479736
6648269
87059301
22311790
19702363
118463997
9932436
5294044
86621222
8282025
5734824
87417553
7818475
5255393
82609492
总结
这里博主仅仅对map中存放的内容进行遍历,但并没有进行复杂的业务处理,甚至连打印都没有,从10、100到1000、10000和100000,我们发现总体来说Iterator的效率最高,forEach次之,forEach()方法最慢。那么,是不是在生产中,我们就应该多使用Iterator呢,而不适用Java8新引进的forEach()方法呢?当然不是。因为在实际生产环境当中,每个循环里都有复杂的业务逻辑,和这些复杂的业务逻辑相比,这里相差的纳秒级别的数值就显得不值一提,当然,效率差距还是有的。如果说你的项目对事件效率要求特别高,使用Iterator就挺好,那如果你极致地追求代码的整洁,那么Java8中的forEach()方法是你的不二之选。