就是有些人循环用的是普通for循环,有些人用的是foreach循环,它们之间有什么区别?应该在什么时候使用这两种循环了?

两种循环的语法格式:

普通for循环语法:

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

foreach 循环语法:

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

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

ArrayList:ArrayList是采用数组的形式保存对象的,这种方式将对象放在连续的内存块中,所以插入和删除时比较麻烦,查询比较方便。

LinkList:LinkList是将对象放在独立的空间中,而且每个空间中还保存下一个空间的索引,也就是数据结构中的链表结构,插入和删除比较方便,但是查找很麻烦,要从第一个开始遍历。

下面是我测试的代码:

  1. public class Main {
  2. public static void main(String[] args){
  3. //实例化arrayList
  4. List<Integer> arrayList = new ArrayList<Integer>();
  5. //实例化linkList
  6. List<Integer> linkList = new LinkedList<Integer>();
  7. //插入10万条数据
  8. for (int i = 0; i < 100000; i++) {
  9. arrayList.add(i);
  10. linkList.add(i);
  11. }
  12. int array = 0;
  13. //用for循环arrayList
  14. long arrayForStartTime = System.currentTimeMillis();
  15. for (int i = 0; i < arrayList.size(); i++) {
  16. array = arrayList.get(i);
  17. }
  18. long arrayForEndTime = System.currentTimeMillis();
  19. System.out.println("用for循环arrayList 10万次花费时间:" + (arrayForEndTime - arrayForStartTime) + "毫秒");
  20. //用foreach循环arrayList
  21. long arrayForeachStartTime = System.currentTimeMillis();
  22. for(Integer in : arrayList){
  23. array = in;
  24. }
  25. long arrayForeachEndTime = System.currentTimeMillis();
  26. System.out.println("用foreach循环arrayList 10万次花费时间:" + (arrayForeachEndTime - arrayForeachStartTime ) + "毫秒");
  27. //用for循环linkList
  28. long linkForStartTime = System.currentTimeMillis();
  29. int link = 0;
  30. for (int i = 0; i < linkList.size(); i++) {
  31. link = linkList.get(i);
  32. }
  33. long linkForEndTime = System.currentTimeMillis();
  34. System.out.println("用for循环linkList 10万次花费时间:" + (linkForEndTime - linkForStartTime) + "毫秒");
  35. //用froeach循环linkList
  36. long linkForeachStartTime = System.currentTimeMillis();
  37. for(Integer in : linkList){
  38. link = in;
  39. }
  40. long linkForeachEndTime = System.currentTimeMillis();
  41. System.out.println("用foreach循环linkList 10万次花费时间:" + (linkForeachEndTime - linkForeachStartTime ) + "毫秒");
  42. }
  43. }

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

  1. 用for循环arrayList 10万次花费时间:5毫秒
  2. 用foreach循环arrayList 10万次花费时间:7毫秒
  3. 用for循环linkList 10万次花费时间:4481毫秒
  4. 用foreach循环linkList 10万次花费时间:5毫秒

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

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

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

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

Java for循环和foreach循环的性能比较的更多相关文章

  1. Java-Runoob-高级教程-实例-方法:13. Java 实例 – for 和 foreach循环使用

    ylbtech-Java-Runoob-高级教程-实例-方法:13. Java 实例 – for 和 foreach循环使用 1.返回顶部 1. Java 实例 - for 和 foreach循环使用 ...

  2. Java数组使用以及foreach循环

    Java数组使用以及foreach循环 二话不说,先甩一个简单的程序: final int NUM= 10; int[] arrays = new int[NUM]; System.out.print ...

  3. 关于java中for和foreach循环

    for循环中的循环条件中的变量只求一次值!具体看最后的图片 foreach语句是java5新增,在遍历数组.集合的时候,foreach拥有不错的性能. foreach是for语句的简化,但是forea ...

  4. for循环和foreach循环遍历集合的效率比较

    先上代码 package com.test; import java.util.ArrayList; import java.util.LinkedList; import java.util.Lis ...

  5. 程序控制结构及for循环、foreach循环、迭代器

    结构化程序设计 三种基本控制结构:顺序结构.选择结构.循环结构. 在这种思想的指导下,发展出了面向过程编程方式.面向过程编程的核心是算法+数据结构.算法可以用顺序.选择.循环这三种基本控制结构来实现. ...

  6. 使用for循环还是foreach循环?

    很多时候我们很自然的认为,for循环的时候使用foreach和原来的for循环用下标的方式遍历是相同的. 而且因为foreach循环写法简单,很容易理解,而且少去了很多麻烦的变量,所以估计在学会使用f ...

  7. JavaScript的map循环、forEach循环、filter循环、reduce循环、reduceRight循环

    1.map循环 let arr=[1,2,3,4]; arr.map(function(value,key,arr){ //值,索引,数组(默认为选定数组) return item; //如果没有re ...

  8. Java的迭代和foreach循环

    Java的迭代(interation statement) Java的迭代(interation statement) 其实就是循环控制语句while.do-while和for,因为他们会从重复地运行 ...

  9. java基础39 增强for循环(也叫foreach循环)

    增强for循环是jdk1.5出现的新功能 1.增强for循环的作用 简化了迭代器的书写格式(注意:增强for循环底层还是使用了迭代器遍历) 2.增强for循环的格式 for(数据类型 变量名:遍历的目 ...

随机推荐

  1. 初等数论及其应用 (第6版) (Kenneth H.Rosen 著)

    第1章 整数 1.1 数和序列 1.2 和与积 1.3 数学归纳法 1.4 斐波那契数 1.5 整除性 第2章 整数的表示法和运算 2.1 整数的表示法 2.2 整数的计算机运算 2.3 整数运算的复 ...

  2. Complete Physics Platformer Kit 学习

    using UnityEngine; /// <summary> /// 摄像机跟随玩家 /// </summary> public class CameraFollow : ...

  3. php7 php-fpm 重启

    PHP7中php.ini.php-fpm和www.conf的配置 http://www.tuicool.com/articles/NjmQNj6 php-fpm 关闭:  kill -SIGINT ` ...

  4. NonAction与ChildActionOnly

    NonAction 表示它不是一个真正的Action,而是一个普通方法: ChildActionOnly 表示它只能在View中通过Html.Action或Html.RenderAction来使用

  5. AI三巨头获2018年图灵奖!

    ACM 宣布,2018 年图灵奖获得者是号称深度学习三巨头的 Yoshua Bengio, Yann LeCun 和 Geoffrey Hinton,得奖理由是:他们在概念和工程上取得的巨大突破,使得 ...

  6. JAVA中数组Array与List互转

    List<String> list = new ArrayList<String>();String[] array = new String[10]; 1.数组转成Listl ...

  7. django用mysql数据库出现的问题解决

    blog添加不了文章!! 做了个程序,将数据库迁移到服务器之后,发现一个奇怪的错误.Field 'id' doesn't have a default value.查看了一下,程序是没问题的,但是这是 ...

  8. golang 自定义json解析

    在实际开发中,经常会遇到需要定制json编解码的情况. 比如,按照指定的格式输出json字符串, 又比如,根据条件决定是否在最后的json字符串中显示或者不显示某些字段. 如果希望自己定义对象的编码和 ...

  9. RedHat如何关闭防火墙

    1.查看防火墙是否已开启 #可以查看到iptables服务的当前状态. service iptables status​ 上图表示防火墙已关闭. 2.关闭防火墙 关闭防火墙的方法为:   1)永久性生 ...

  10. jquery位置问题

    在页面中添加jquery时,一定要把jquery放在其他js文件前面!不然会出现"$ is not defined", 导致js无法正常运行.