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,因为提供了更好的可读性。

posted on 2021-11-20 17:10  真情的风  阅读(739)  评论(0)    收藏  举报