我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java 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倍左右

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP 中 for 循环和 foreach 循环的性能和可读性

本文对 PHP 中的 for 循环和 foreach 进行了比较。该比较旨在确定哪个循环具有更快的执行速度和更好的可读性。for 循环和 foreach 循环与范围我们在十万次迭代中比较了 for 循环和 foreach 循环与 range
PHP 中 for 循环和 foreach 循环的性能和可读性
2024-02-27

Java和Python中for循环的比较

Java是强类型的语言,而python是弱类型的语言。先看Java中的for循环使用,如下图:package test06;public cl
2023-01-31

vue中v-for循环对象的示例分析

这篇文章将为大家详细讲解有关vue中v-for循环对象的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、循环对象内的值