java 循环遍历列表的性能比较
java 循环性能比较测试
Java 提供了多种方法来迭代List. 其中一些正在使用:
- 流API
- 列表迭代器接口
- 增强for循环
- 简单的for循环
在这篇文章中,我们将所有循环方法与同一组数据进行比较,以比较它们的相对性能。
1 . 循环遍历列表的不同方法
1.1流API
java8 stream API 提供了迭代集合和操作元素的方法
private static List<Integer> list = new ArrayList<>(); list.stream().forEach(consumerAction);
1.2列表迭代器接口
private static List<Integer> list = new ArrayList<>(); list.listIterator().forEachRemaining(consumerAction);
1.3 增强for循环
private static List<Integer> list = new ArrayList<>(); for(Integer i : list) { // do other stuff }
1.4简单for循环
private static List<Integer> list = new ArrayList<>(); int size = list.size(); for(int j = 0; j < size ; j++) { //do stuff }
2.性能比较
我们创建一个ArrayList,并用一百万个Integer填充它,然后我们使用这4种遍历方式列表,以此来了解每种for循环的性能差异
执行环境
java8
2.1测试代码
private static List<Integer> list = new ArrayList<>(); static { for(int i=0; i < 1_0_000; i++) { list.add(i); } } @Benchmark @Fork(value = 1, warmups = 1) @BenchmarkMode(Mode.Throughput) public void usingStream(Blackhole blackhole) { list.stream().forEach(i -> blackhole.consume(i)); } @Benchmark @Fork(value = 1, warmups = 1) @BenchmarkMode(Mode.Throughput) public void usingIterator(Blackhole blackhole) { list.listIterator().forEachRemaining(i -> blackhole.consume(i)); } @Benchmark @Fork(value = 1, warmups = 1) @BenchmarkMode(Mode.Throughput) public void usingForEachLoop(Blackhole blackhole) { for(Integer i : list) { blackhole.consume(i); } } @Benchmark @Fork(value = 1, warmups = 1) @BenchmarkMode(Mode.Throughput) public void usingSimpleForLoop(Blackhole blackhole) { for(int i = 0; i < list.size() ; i++) { blackhole.consume(i); } }
2.2测试结果

显然,使用简单的for循环在性能上,遥遥领先,
但是我们在实际开发中不会经常出现百万级别列表来循环,所以常用的还是增强for循环和streamAPI,因为提供了更好的可读性。
浙公网安备 33010602011771号