java中几种循环的性能对比以及区别

代码

//基础测试代码
 public static void main(String[] args) {
        int capacity = 10000;
        List<Integer> l = new ArrayList<>(capacity);
        for (int i = 0; i < capacity; i ++) {
            l.add(i);
        }
        System.out.println("list.size:" + capacity);
        Long start2 = System.currentTimeMillis();
        for (Integer i : l) {
            i = i + 1;
        }
        System.out.println("for-each:" + (System.currentTimeMillis() - start2));

        Long start3 = System.currentTimeMillis();
        for (int i = 0; i < l.size(); i++) {
            int a = l.get(i);
            a = a + 1;
        }
        System.out.println("fori each:"+(System.currentTimeMillis() - start3));

        Long start = System.currentTimeMillis();
        l.stream().forEach(i -> i++);
        System.out.println("stream.forEach:" + (System.currentTimeMillis() - start));

        Long start5 = System.currentTimeMillis();
        l.stream().forEachOrdered(i -> i++);
        System.out.println("stream.forEachOrder:" + (System.currentTimeMillis() - start5));

        Long start1 = System.currentTimeMillis();
        l.forEach(i -> i ++);
        System.out.println("forEach():" + (System.currentTimeMillis() - start1));
        Long start4 = System.currentTimeMillis();
        l.parallelStream().forEach(i -> i ++);
        System.out.println("parallelStream.forEach:" +(System.currentTimeMillis() - start4));
    }

执行结果

执行结果根据不同的数量级,有所不同

一:1w
list.size():10000
for-each:5
fori each:2
stream.forEach:101
stream.forEachOrder:2
forEach():1
parallelStream.forEach:8
二:100w
for-each:11
fori each:8
stream.forEach:102
stream.forEachOrder:10
forEach():9
parallelStream.forEach:44
三:1亿
for-each:470
fori each:92
stream.forEach:189
stream.forEachOrder:106
forEach():102
parallelStream.forEach:95

从三种不同量级的结果可以得出结论

在1w-100w区间,forEach()与for-each执行速率相差很小,stream().forEach的执行速率基本无变化

在1亿数据量级别,forEach()与for-each耗时增加较多,但stream().forEach变化依旧很小,而stream并行流在数据量增加的情况下,性能表现最好。

stream().forEach()与stream().forEachOrder()也有所不同,forEachOrder()速率从1w-1亿执行速度都有明显的优势

该如何选择

除了从执行速度上有所区别外,不同的loop有着不同的效果

如:steam() 序列流能够保证顺序(不确定),而parallerStream则无法保证速率但能够并发执行,但Iterable.forEach()由于使用的是迭代器,因此可以保证顺序。

forEach()与for-each如何选择?
  • 转换为中文,整理优缺点
  • Can’t use non-final variables 无法使用非最终变量
  • Can’t handle check exception 不能处理检查性异常,如果forEach中有检查性异常需要用try-catch
  • limited flow-control 有限的流量控制 lambda的return等于for-each中的continue,但没有相当于break的东西。
  • Might execute in paraller, 可能有概率是并发执行

来源:
https://stackoverflow.com/questions/16635398/java-8-iterable-foreach-vs-foreach-loop

Stream.forEach与Iterable.forEach()如何选择?

主要还是在速度上的选择与业务
https://stackoverflow.com/questions/23218874/what-is-difference-between-collection-stream-foreach-and-collection-foreach

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值