Java for循环和foreach循环的性能对比分析

目录
  • for循环和foreach循环的性能对比
    • 普通for循环语法
    • foreach 循环语法
  • for与foreach循环效率比较
    • 对于数组来说
    • 对于链表来说
    • 小结一下吧

for循环和foreach循环的性能对比

在公司codereview过程中,发现一个问题,就是有些人循环用的是普通for循环,有些人用的是foreach循环,它们之间有什么区别?应该在什么时候使用这两种循环了?

两种循环的语法格式:

普通for循环语法

for (int i = 0; i < integers.length; i++) {
    System.out.println(intergers[i]);
}

foreach 循环语法

for(Integer in : integers){
    System.out.println(in);
}

今天我们来比较一下两种for循环对ArrayList和LinkList集合的循环性能比较。首先简单的了解一下ArrayList和LinkList的区别:

  • ArrayList:ArrayList是采用数组的形式保存对象的,这种方式将对象放在连续的内存块中,所以插入和删除时比较麻烦,查询比较方便。
  • LinkList:LinkList是将对象放在独立的空间中,而且每个空间中还保存下一个空间的索引,也就是数据结构中的链表结构,插入和删除比较方便,但是查找很麻烦,要从第一个开始遍历。

下面是我测试的代码:

public class Main {
 public static void main(String[] args){
  //实例化arrayList
  List<Integer> arrayList = new ArrayList<Integer>();
  //实例化linkList
  List<Integer> linkList = new LinkedList<Integer>();

  //插入10万条数据
  for (int i = 0; i < 100000; i++) {
   arrayList.add(i);
   linkList.add(i);
  }

  int array = 0;
  //用for循环arrayList
  long arrayForStartTime = System.currentTimeMillis();
  for (int i = 0; i < arrayList.size(); i++) {
   array = arrayList.get(i);
  }
  long arrayForEndTime = System.currentTimeMillis();
  System.out.println("用for循环arrayList 10万次花费时间:" + (arrayForEndTime - arrayForStartTime) + "毫秒");

  //用foreach循环arrayList
  long arrayForeachStartTime = System.currentTimeMillis();
  for(Integer in : arrayList){
   array = in;
  }
  long arrayForeachEndTime = System.currentTimeMillis();
  System.out.println("用foreach循环arrayList 10万次花费时间:" + (arrayForeachEndTime - arrayForeachStartTime ) + "毫秒");

  //用for循环linkList
  long linkForStartTime = System.currentTimeMillis();
  int link = 0;
  for (int i = 0; i < linkList.size(); i++) {
   link = linkList.get(i);
  }
  long linkForEndTime = System.currentTimeMillis();
  System.out.println("用for循环linkList 10万次花费时间:" + (linkForEndTime - linkForStartTime) + "毫秒");

  //用froeach循环linkList
  long linkForeachStartTime = System.currentTimeMillis();
  for(Integer in : linkList){
   link = in;
  }
  long linkForeachEndTime = System.currentTimeMillis();
  System.out.println("用foreach循环linkList 10万次花费时间:" + (linkForeachEndTime - linkForeachStartTime ) + "毫秒");
 }
}

循环10万次的时候,控制台打印结果:

用for循环arrayList 10万次花费时间:5毫秒

用foreach循环arrayList 10万次花费时间:7毫秒

用for循环linkList 10万次花费时间:4481毫秒

用foreach循环linkList 10万次花费时间:5毫秒

可以看出,循环ArrayList时,普通for循环比foreach循环花费的时间要少一点;循环LinkList时,普通for循环比foreach循环花费的时间要多很多。

当我将循环次数提升到一百万次的时候,循环ArrayList,普通for循环还是比foreach要快一点;但是普通for循环在循环LinkList时,程序直接卡死。

结论:需要循环数组结构的数据时,建议使用普通for循环,因为for循环采用下标访问,对于数组结构的数据来说,采用下标访问比较好。

需要循环链表结构的数据时,一定不要使用普通for循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。

for与foreach循环效率比较

对于数组来说

for循环略慢foreach

对于链表来说

for循环比foreach慢很多。因为for循环每次获取链表节点都要重头开始查找,而foreach是采用迭代方式,查找节点只需遍历一次,节省了很多时间。

小结一下吧

在循环操作中不涉及插入、删除等行为时,优先使用foreach

在循环操作中涉及插入、删除等破坏数组或链表原始映像行为时,应使用for

坊间传闻,foreach的效率要比for的效率快8倍左右

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Java中的增强 for 循环 foreach

    foreach 是 Java 中的一种语法糖,几乎每一种语言都有一些这样的语法糖来方便程序员进行开发,编译期间以特定的字节码或特定的方式来对这些语法进行处理.能够提高性能,并减少代码出错的几率.在 Java 中还有比如 泛型.自动拆箱.自动装箱.内部类.枚举等等. foreach 是用来对数组或者集合进行遍历的语法.具体语法如下: for(元素类型 ele : 数组名/Iterable 实例){ } 下面我们用 foreach 来对数组和一个集合进行遍历: int [] array = {1,2

  • java中for和forEach的速度比较实例Demo

    背景 之前和同事讨论一个问题,他们公司调研中发现forEach的速度比for的速度慢,当刚听到这个结论的时候有点诧异.因为之前看过国外的文章和他们公司的结论一样,但是测试用例单一.今天正好在看flink相关的流处理,正好想起来了这个问题,然后简单的写了一个demo来进行推翻这个结论. 废话不多说直接上代码吧 package pers.bik.flink; import java.util.ArrayList; import java.util.List; import java.util.con

  • java迭代器和for循环优劣详解

    在进行迭代的时候,程序运行的效率也是我们挑选迭代方法的重要原因.目前有三种迭代方法:for循环.迭代器和Foreach.前两者相信大家都非常熟悉,为了更加直观分析效率的不同,我们还加入Foreach一起比较.下面我们就三种方法的概念进行理解,然后ArrayList中探索三种方法的效率. 1.概念理解 for循环:是支持迭代的一种通用结构,是最有效,最灵活的循环结构 迭代器:是通过集合的iterator()方法得到的,所以我们说它是依赖于集合而存在的 Foreach:通过阅读源码我们还发现一个It

  • 深入理解java中for和foreach循环

    •for循环中的循环条件中的变量只求一次值!具体看最后的图片 •foreach语句是java5新增,在遍历数组.集合的时候,foreach拥有不错的性能. •foreach是for语句的简化,但是foreach并不能替代for循环.可以这么说,任何foreach都能改写为for循环,但是反之则行不通. •foreach不是java中的关键字.foreach的循环对象一般是一个集合,List.ArrayList.LinkedList.Vector.数组等. •foreach的格式: for(元素类

  • Java for循环和foreach循环的性能对比分析

    目录 for循环和foreach循环的性能对比 普通for循环语法 foreach 循环语法 for与foreach循环效率比较 对于数组来说 对于链表来说 小结一下吧 for循环和foreach循环的性能对比 在公司codereview过程中,发现一个问题,就是有些人循环用的是普通for循环,有些人用的是foreach循环,它们之间有什么区别?应该在什么时候使用这两种循环了? 两种循环的语法格式: 普通for循环语法 for (int i = 0; i < integers.length; i

  • 关于pytorch多GPU训练实例与性能对比分析

    以下实验是我在百度公司实习的时候做的,记录下来留个小经验. 多GPU训练 cifar10_97.23 使用 run.sh 文件开始训练 cifar10_97.50 使用 run.4GPU.sh 开始训练 在集群中改变GPU调用个数修改 run.sh 文件 nohup srun --job-name=cf23 $pt --gres=gpu:2 -n1 bash cluster_run.sh $cmd 2>&1 1>>log.cf50_2GPU & 修改 –gres=gpu:

  • Java Iterator迭代器与foreach循环代码解析

    目录 一. Iterator迭代器接口 1. 使用 Iterator 接口遍历集合元素 2. Iterator接口的方法 3. 迭代器的执行原理 3.1 代码演示 3.2 代码执行过程解析 4. Iterator接口remove()方法 4.1 代码演示 4.2 注意 5. 代码演示 二.foreach 循环 1. 概述 2. 语法解析 3. 代码演示 4. 易错题 一. Iterator迭代器接口 1. 使用 Iterator 接口遍历集合元素 Iterator对象称为迭代器(设计模式的一种)

  • Python判断值是否在list或set中的性能对比分析

    本文实例对比分析了Python判断值是否在list或set中的执行性能.分享给大家供大家参考,具体如下: 判断值是否在set集合中的速度明显要比list快的多, 因为查找set用到了hash,时间在O(1)级别. 假设listA有100w个元素,setA=set(listA)即setA为listA转换之后的集合. 以下做个简单的对比: for i in xrange(0, 5000000): if i in listA: pass for i in xrange(0, 5000000): if

  • php中随机函数mt_rand()与rand()性能对比分析

    本文实例对比分析了php中随机函数mt_rand()与rand()性能问题.分享给大家供大家参考.具体分析如下: 在php中mt_rand()和rand()函数都是可以随机生成一个纯数字的,他们都是需要我们设置好种子数据然后生成,那么mt_rand()和rand()那个性能会好一些呢,下面我们带着疑问来测试一下. 例子1. mt_rand() 范例,代码如下: 复制代码 代码如下: <?php echo mt_rand() . "n"; echo mt_rand() . &quo

  • pytorch 数据加载性能对比分析

    传统方式需要10s,dat方式需要0.6s import os import time import torch import random from common.coco_dataset import COCODataset def gen_data(batch_size,data_path,target_path): os.makedirs(target_path,exist_ok=True) dataloader = torch.utils.data.DataLoader(COCODat

  • 详解JAVA中的for-each循环与迭代

    在学习java中的collection时注意到,collection层次的根接口Collection实现了Iterable<T>接口(位于java.lang包中),实现这个接口允许对象成为 "foreach" 语句的目标,而此接口中的唯一方法,实现的就是返回一个在一组 T 类型的元素上进行迭代的迭代器. 一.迭代器Iterator 接口:Iterator<T> public interface Iterator<E>{ boolean hasNext

  • Java List接口与Iterator接口及foreach循环使用解析

    目录 List接口 ArrayList集合 LinkedList集合 Iterator接口 foreach循环 List接口 List接口继承Collection接口,属于单列集合,在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中通过索引来访问集合中的指定元素,元素是顺序存储的,即元素的存入顺序和取出顺序一致. ArrayList集合 ArrayList是List接口的一个实现类,在ArrayList内部封装了一个长度可变的数组对象. package 集合类;

  • 浅谈C#中的for循环与foreach循环

    for循环和foreach循环其实可以算得上是从属关系的,即foreach循环是可以转化成for循环,但是for循环不一定能转换成foreach循环. 下面简单介绍一下两种循环: 1.for循环 代码格式: for(表达式1;循环条件;表达式2) { 循环体 } 代码含义: 首先运行表达式1; 然后判断条件是否为真,如果为真,则执行循环体,执行完后再运行表达式2: 接着再判断循环条件--直到循环条件为假才会结束循环. 注意事项: 表达式1:可以是任何代码,一定会执行且只会执行一次: 表达式2:可

随机推荐