在开发代码过程中,发现在循环操作List的时候,有的人习惯用for循环,有的人习惯用foreach循环。那这两个是一样的吗,或者说哪个更好一点呢?

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

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

下面是测试速度的代码:

package org.harmony.test;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;/*** for和foreach测试,验证一下分别在List中操作性能* */
public class TestForAndForeach {public static void main(String[] args) {// ArrayList是采用数组的形式保存对象的,这种方式将对象放在连续的内存块中,所以插入和删除时比较麻烦(时间复杂度为O(n)),查询比较方便(时间复杂度为O(1))。List<Integer> arrayList = new ArrayList<>();// LinkedList是将对象放在独立的空间中,而且每个空间中还保存下一个空间的索引,也就是数据结构中的链表结构,插入和删除比较方便(时间复杂度为O(1)),但是查找很麻烦,要从第一个开始遍历(时间复杂度为O(n))。List<Integer> linkedList = new LinkedList<>();for (int i = 0; i < 200000; i++) {arrayList.add(i);linkedList.add(i);}int array = 0;//用for循环arrayListlong arrayForStartTime = System.currentTimeMillis();for (int i = 0; i < arrayList.size(); i++) {array = arrayList.get(i);}long arrayForEndTime = System.currentTimeMillis();System.out.println("用for循环arrayList 20万次花费时间:" + (arrayForEndTime - arrayForStartTime) + "毫秒");//用foreach循环arrayListlong arrayForeachStartTime = System.currentTimeMillis();for(Integer in : arrayList){array = in;}long arrayForeachEndTime = System.currentTimeMillis();System.out.println("用foreach循环arrayList 20万次花费时间:" + (arrayForeachEndTime - arrayForeachStartTime ) + "毫秒");//用for循环linkListlong linkForStartTime = System.currentTimeMillis();int link = 0;for (int i = 0; i < linkedList.size(); i++) {link = linkedList.get(i);}long linkForEndTime = System.currentTimeMillis();System.out.println("用for循环linkList 20万次花费时间:" + (linkForEndTime - linkForStartTime) + "毫秒");//用froeach循环linkListlong linkForeachStartTime = System.currentTimeMillis();for(Integer in : linkedList){link = in;}long linkForeachEndTime = System.currentTimeMillis();System.out.println("用foreach循环linkList 20万次花费时间:" + (linkForeachEndTime - linkForeachStartTime ) + "毫秒");}
}

运行后的结果如下:

用for循环arrayList 20万次花费时间:7毫秒
用foreach循环arrayList 20万次花费时间:8毫秒
用for循环linkList 20万次花费时间:27162毫秒
用foreach循环linkList 20万次花费时间:7毫秒

可以看到:

  1. 在循环操作ArrayList的时候,使用for和foreach速度差不多,for稍微快一点。实际操作ArrayList使用过程中建议使用for循环,因为for循环采用下标访问,对于数组结构的数据来说,采用下标访问比较好。
  2. 在循环操作LinkedList的时候,使用for和foreach速度差非常多。所以在操作LinkedList的时候,一定要使用foreach循环。如果使用for循环,数据量大的时候有可能会导致系统崩溃。

需要更多教程,微信扫码即可

for和foreach相关推荐

  1. 浅显易懂 Makefile 入门 (07)— 其它函数(foreach 、if、call、origin )

    1. foreach 函数 foreach 函数定义如下: $(foreach <var>,<list>,<text>) 函数的功能是:把参数 <list&g ...

  2. 2021年大数据常用语言Scala(二十一):函数式编程 遍历 foreach

    目录 遍历  foreach 使用类型推断简化函数定义 使用下划线来简化函数定义 遍历  foreach 之前,学习过了使用for表达式来遍历集合.我们接下来将学习scala的函数式编程,使用fore ...

  3. [JS] for-each和map()的区别

    先说下for-each与for-of还有for-in的区别. for-of和for-in都是对对象操作的,而for-each和map()是对数组进行操作的. for-in的使用:对于一个数组里的每一个 ...

  4. java 增强for循环(foreach)

    学而时习之,温故而知新. java的增强fou循环(foreach) 是java5的新特征之一 foreach的循环对象一般是一个集合,List.ArrayList.LinkedList.Vector ...

  5. Scala中的foreach方法和map方法

    两个方法的共同点在于(foreach和map):都是用于遍历集合对象,并对每一项执行指定的方法. 而两者的差异在于:foreach无返回值(准确说返回void),map返回集合对象. 结论就是:for ...

  6. Java数组传参sql_Java中如何传一个数组作为筛选条件操作数据库(sql中foreach的使用)...

    实现步骤: 1. 把前端获取到的要删除的数据的nId,以逗号作为分隔符,组成一个da(其中checkStatus.data.length和checkStatus.data[i].nId是layui里面 ...

  7. java foreach delete_Java CopyOnWriteArrayList forEach()用法及代码示例

    CopyOnWriteArrayList的forEach()方法为Iterable的每个元素执行给定的操作,直到已处理完所有元素或该操作引发异常. 用法: public void forEach (C ...

  8. java foreach order_Java 8流中的forEach vs forEachOrdered

    我知道这些方法的执行顺序不同,但在所有测试中,我都无法实现不同的执行顺序. 例子: System.out.println("forEach Demo"); Stream.of(&q ...

  9. ecshop模板smarty foreach详解 [ECshop]

    {foreach},{foreachelse} {foreach} 用于像循环访问一个数字索引数组一样循环访问一个关联数组,与仅能访问数字索引数组的{section}不同,{foreach}的语法比 ...

  10. php foreach嵌套foreach,php中foreach怎么嵌套foreach PHP中foreach函数用法?

    foreach的使用方法小编不是很明确,分享达人指教一下.foreach (array_expressforeach($array as $key) { if(xxxx) { break; //bre ...

最新文章

  1. Android自定义旋钮效果,Android自定义悬浮按钮效果实现,带移动效果
  2. Linux系统.xsesion日志文件,linux系统日志
  3. win7 64位IE无法运行ActiveX控件的解决方法
  4. [转]学校的统一订书80%该烧掉——IT推荐书单
  5. MySQL中获取天、周、月等数据
  6. 在vsphere6.5启用Tesla K80
  7. scheme 学习:pair 和 list
  8. java未检查异常_Java中已检查和未检查的异常
  9. 窗口程序ImageView(仿QQ图片查看器)
  10. 关于tomcat内路径跳转的一些思考
  11. 前端Http协议缓存初解
  12. linux读取扇区内容,linux-device-driver
  13. Android 版权介绍
  14. 【笔试/面试】—— 计算一个数二进制形式中 0 的个数
  15. 4. Linux 系统目录
  16. 计算机多余自动启动项,去掉多余的开机启动项
  17. Python读取PDF文档并翻译
  18. 【云云怪】第4个项目:20以内加减法(剧情版)
  19. 前后端项目的糅合模式mashup
  20. 【算法】矩阵连乘(MatrixMultiply)

热门文章

  1. 太难了!线下教培受重创,这家企业无奈宣布全员工资3.5折5个月
  2. 美团推出语音应用平台 已与奔驰、小米等企业达成合作
  3. 网友评荣耀V30:同价位无对手 除了双模5G和价格还有哪些原因
  4. 3299元!最便宜的5G手机明日开启预售
  5. 专访余承东:华为引领行业进步 折叠屏手机即将上市
  6. 女子15000元网购兰基博尼跑车,上路就被查了,这操作真没见过!
  7. 三星官方回应“7nm EUV良率”:内容与事实完全不符
  8. 情侣签到365天获1000现金?这款App被关停下架了 网友拍手称快!
  9. 软件安全测试:安全左移的痛点与要点
  10. vscode remote 第三方库_分钟将vscode撸成小霸王