• 存放80000000学生成绩的集合,怎么统计平均分性能高


    大家好,我是雄雄,好久不介绍一下我,就被大家淡忘了……

    我们都知道,遍历集合的方式最常用的有两种,一种是使用下标的方式遍历,第二种便是使用foreach遍历,代码分别如下:

    使用下标的方法:

    public static void testGetIndex(){
        int num = 5;
        //声明集合
        List<Integer> lists = new ArrayList<Integer>(num);
        //给集合中赋值(0-150之间的随机数)
        for (int i = 0; i < num; i++) {
          lists.add(new Random().nextInt(150));
        }
        //使用下标遍历
        for (int i = 0; i < lists.size(); i++) {
          System.out.print(lists.get(i)+" ");
        }
      }

    结果如下:

    使用foreach的方法:

    public static void testForeach(){
        int num = 5;
        //声明集合
        List<Integer> lists = new ArrayList<Integer>(num);
        //给集合中赋值(0-150之间的随机数)
        for (int i = 0; i < num; i++) {
          lists.add(new Random().nextInt(150));
        }
        //使用下标遍历
        for (int i :lists) {
          System.out.print(i+" ");
        }
      }

    结果如下:

    我们可以看到,这种方法在表面看起来区别不是很大,甚至可以说foreach遍历的方法要比下标遍历的方式还要简单。

    那如果我们从另一角度——比如性能方面来看它两的区别呢,谁又更胜一筹?

    下面我们来结合案例具体分析一下两种方法在性能方面的差异:

    某市有80000000学生,在某一次市内组织的考试后,接上面指示,需要对本市8千万学生的成绩进行统计并计算平均分。

    案例很简单,无外乎就是将8千万学生的成绩加起来除以8千万,代码如下:

    public static void test1(){
        int num = 80*100000;
        List<Integer> score = new ArrayList<Integer>(num);
        //随机生成分数赋值到集合中
        for(int i= 0;i<num;i++){
          score.add(new Random().nextInt(150));
        }
        //开始记录时间
        long strat = System.currentTimeMillis();
        System.out.println("平均分是:"+avgForeach(score));
        long end = System.currentTimeMillis();
        System.out.println("执行时间是:"+(end-strat)+"ms");
        
      }

    注意看avg的方法,我们先用foreach的方法计算平均分,结果如下:

    public static int avgForeach(List<Integer> score){
        int sum = 0;
        for(int i : score){
          sum+=i;
        }
        return sum/score.size();
      }

    接下来我们使用下标的方法计算平均分,结果如下:

    public static int avgIndex(List<Integer> score){
          int sum = 0;
          for(int i=0;i<score.size();i++){
            sum+=score.get(i);
          }
          return sum/score.size();
        }

    可以看得出来,使用下标遍历的方法要比使用foreach遍历的方法要快许多

    我们仅仅只是统计平均分,就相差46ms,如果有别的比如加权平均值、补充平均值等,花费时间会更长。

    需要注意的是,在数据量小的情况下,无论哪种方式,性能差异不是很大!

    案例灵感来自:《编写高质量代码:改善java程序的151个建议》

    作者:秦小波

    往期精彩

    asList方法产生的List对象不可更改

    2020-09-29

    避开基本类型数组转换列表陷阱

    2020-09-28

    java中最值的求法,你可能忽略了这种方法了!

    2020-09-27

    在明确的场景下,为集合指定初始容量

    2020-09-26

    警惕数组的浅拷贝

    2020-09-25

    若有必要,使用变长数组

    2020-09-24

    支持作者

    赞赏就不用啦,生活都不易,右下角的“在看/赞”点一下,如果感觉文章不错,记得分享到朋友圈让更多人知道!

    点分享

    点点赞

    点在看

  • 相关阅读:
    JAVA语言编程思维入门
    C语言入门编程思维引导
    Spring入门
    Linux设置Swap虚拟内存方法
    WordPress在Centos下Apache设置伪静态方法
    Maven(十五)Maven 聚合
    Maven(十四)Maven 继承
    Maven(十三)Maven统一声明版本号
    Maven(十二)Maven 依赖详解
    Maven(十一)导入手动创建的Maven 工程
  • 原文地址:https://www.cnblogs.com/a1111/p/14877399.html
Copyright © 2020-2023  润新知