Java List循环一般写法与stream性能对比

java 版本:

如果需要对一个List进行循环,stream出来以后,我们又多了一种实现方式。但stream方式性能如何,各种说法都有,总体结论是没有一个标准答案,受各种环境影响。耳听为虚眼见为实,我们还是要自己动手试一下,才能有一个直观的感受,先直接上代码。

        int size = 10;
        // 为了防止读一个list读性能影响,各自读一个list
        List<Integer> list1 = new ArrayList<>(size);
        List<Integer> list2 = new ArrayList<>(size);
        List<Integer> list3 = new ArrayList<>(size);
        List<Integer> list4 = new ArrayList<>(size);
        List<Integer> list5 = new ArrayList<>(size);
        List<Integer> list6 = new ArrayList<>(size);
        for(int i = 0; i < size; i++) {
            list1.add(i);
            list2.add(i);
            list3.add(i);
            list4.add(i);
            list5.add(i);
            list6.add(i);
        }

        // 用线程池来执行
        ExecutorService executorService = Executors.newFixedThreadPool(6);

        executorService.submit(()->{
            long t = System.nanoTime();
            List<String> result = new ArrayList<>(size);
            for (int i = 0; i <list2.size(); i++) {
                result.add(list2.get(i).toString());
            }
            System.out.println("for i i++ for time:      "+ (System.nanoTime()-t));
        });

        executorService.submit(()->{
            long t = System.nanoTime();
            List<String> result = new ArrayList<>(size);
            for(Integer i : list3){
                result.add(i.toString());
            }
            System.out.println("for i:list time:         " + (System.nanoTime()-t));
        });

        executorService.submit(()->{
            long t = System.nanoTime();
            List<String> result = new ArrayList<>(size);
            list4.forEach(i->{
                result.add(i.toString());
            });
            System.out.println("forEach time:            " + (System.nanoTime()-t));
        });
        executorService.submit(()->{
            long t = System.nanoTime();
            List<String> result = new ArrayList<>(size);
            list5.stream().forEach(i->{
                result.add(i.toString());
            });
            System.out.println("stream forEach time:     " + (System.nanoTime()-t));
        });
        executorService.submit(()->{
            long t = System.nanoTime();
            List<String> result = new ArrayList<>(size);
            Iterator<Integer> iterator = list6.iterator();
            while (iterator.hasNext()){
                result.add(iterator.next().toString());
            }
            System.out.println("Iterator time:           " + (System.nanoTime()-t));
        });

        executorService.submit(()->{
            long t = System.nanoTime();
            List<String> result = new ArrayList<>(size);
            list1.stream().parallel().forEach(i->{
                result.add(i.toString());
            });
            System.out.println("stream parallel time:    " + (System.nanoTime()-t));
        });
        executorService.shutdown();


size=10时间

for i i++ for time:      53600
for i:list time:         44300
forEach time:            2022100
Iterator time:           45800
stream forEach time:     3911300


size=100时间

for i i++ for time:      184000
for i:list time:         130900
Iterator time:           125600
forEach time:            2322100
stream forEach time:     4455200
stream parallel time:    8065700

size=1000时间

for i i++ for time:      765600
for i:list time:         1880400
forEach time:            1679600
Iterator time:           379400
stream forEach time:     3801400
stream parallel time:    8549700


size=10000(1W)时间

for i i++ for time:      6572000
for i:list time:         7531800
forEach time:            7275200
Iterator time:           2865600
stream forEach time:     13723200
stream parallel time:    11157400

size=100000(10W)时间

for i i++ for time:      55485700
stream forEach time:     53776100
Iterator time:           54551800
for i:list time:         61173500
stream parallel time:    21724400
forEach time:            58461600


size=1000000(100W)时间

Iterator time:           2016258400
for i i++ for time:      2653177400
stream parallel time:    2022854000
stream forEach time:     2034483500
for i:list time:         2045225900
forEach time:            2051831300


基本结论:

从上面数据得出结论是数据量对性能评价影响较大,数据量无排序要求时推荐用stream parrellel,数据量比较小(100W以下),一般业务场景下,还是老老实实用普通写法吧,毕竟这么多年的优化,基本写法效率还是很高的。

根据Java List循环一般写法与stream性能对比_笑笑和哈哈的博客-CSDN博客重新测试

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值