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

举报
穆雄雄 发表于 2022/12/12 21:06:56 2022/12/12
【摘要】 大家好,我是雄雄,好久不介绍一下我,就被大家淡忘了……我们都知道,遍历集合的方式最常用的有两种,一种是使用下标的方式遍历,第二种便是使用foreach遍历,代码分别如下:使用下标的方法:public static void testGetIndex(){ int num = 5; //声明集合 List<Integer> lists = new ArrayList<Inte...

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

我们都知道,遍历集合的方式最常用的有两种,一种是使用下标的方式遍历,第二种便是使用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个建议》

作者:秦小波

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。