在Java中对于集合的遍历,一般有以下三种方法:

for循环

foreach循环

Iterator遍历

下面来分析一下for循环和foreach循环的效率对比以及简单分析一下原因。

看下面的代码:

public class ForTest {

public static void testArrayList(ArrayList arrayList) {

System.out.println("测试ArrayList for");

long starTime = System.currentTimeMillis();

for(int i =0;i

int x = arrayList.get(i);

}

long endTime = System.currentTimeMillis();

System.out.println("时间是:"+(endTime - starTime));

System.out.println("测试ArrayList foreach");

long starTime1 = System.currentTimeMillis();

for(int i: arrayList) {

int y = i;

}

long endTime1 = System.currentTimeMillis();

System.out.println("时间是:"+(endTime1 - starTime1));

}

public static void testLinkedList(LinkedList linkedList) {

System.out.println("测试linkedList for");

long starTime = System.currentTimeMillis();

for(int i =0;i

int x = linkedList.get(i);

}

long endTime = System.currentTimeMillis();

System.out.println("时间是:"+(endTime - starTime));

System.out.println("测试linkedList foreach");

long starTime1 = System.currentTimeMillis();

for(int i: linkedList) {

int y = i;

}

long endTime1 = System.currentTimeMillis();

System.out.println("时间是:"+(endTime1 - starTime1));

}

public static void main(String[] args) {

ArrayList arrayList = new ArrayList<>();

LinkedList linkedList = new LinkedList<>();

for(int i =0;i<100000;i++) {

arrayList.add(i);

linkedList.add(i);

}

testArrayList(arrayList);

testLinkedList(linkedList);

}

}

对比如下:

测试ArrayList for

时间是:6

测试ArrayList foreach

时间是:5

测试linkedList for

时间是:4515

测试linkedList foreach

时间是:2

从以上答案分析出ArrayList中for和foreach循环效率差不多,但是LinkedList中for循环效率明显比foreach循环效率低很多。

分析字节码:

image.png

从字节码中可以看出:对于for循环就是调用get(i)取得元素,而对于foreach是通过iterator实现的遍历,上述结果产生的原因主要是因为不同的数据结构产生的。

对于ArrayList来说,它是通过一个数组实现的,可以随机存取;但是LinkedList是通过链表实现的,for循环时要获取第i个元素必须从头开始遍历,而iterator遍历就是从头开始遍历,遍历完只需要一次,所以for循环需要的时间远远超过for循环。

总结:

对于数组来说,for和foreach循环效率差不多,但是对于链表来说,for循环效率明显比foreach低。

foreach是同步还是异步JAVA,Java中foreach与正常for循环效率对比相关推荐

  1. 【Promise】入门-同步回调-异步回调-JS中的异常error处理-Promis的理解和使用-基本使用-链式调用-七个关键问题

    文章目录 1. 预备知识 1.1 实例对象与函数对象 1.2 两种类型的回调函数 1. 同步回调 2. 异步回调 1.3 JS中的异常error处理 1. 错误的类型 2. 错误处理(捕获与抛出) 3 ...

  2. JAVA面试中问及Hibernate与 Mybatis的对比

    我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...

  3. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

    hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加 ...

  4. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结

    我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...

  5. 计算机同步与异步的概念,同步与异步到底是什么???

    总得来说,同步异步出现在以下几个领域: 1  计算机网络. 数据通信技术中有同步通信与异步通信.同步通信简单的说就是你在发送数据时候我必须同时接受.这个过程有精确的时钟控制.而异步通信是你在发数据时候 ...

  6. Java面试题:SSH和SSM原理对比总结以及牵扯到的面试问题

    当下流行的两种企业开发MVC开源框架,是我们Java程 序猿必备知识能力.MVC是Model-View-Controller的简写."Model" 代表的是应用的业务逻辑dao层. ...

  7. JavaScript中foreach()用法及使用的坑

    JavaScript中foreach()用法及使用的坑 JavaScript中foreach是用于遍历数组的方法,将遍历到的元素传递给回调函数,遍历的数组不能是空的要有值. foreach 语法: [ ...

  8. 浅析C#中foreach引用变量

    昨天做老师的网站作业.要对一些对象做添加修改删除处理.别的倒没什么,删除时出现了点问题似的. 因为是从一个类的集合中删除掉一个元素.这样就要遍历整个集合,而foreach正是为遍历准备的新玩意.自然而 ...

  9. java 同步异步_Java中的同步于异步

    java异步同步应用 所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回.所以异步的同义语是非阻塞(None Blocking). 网上有很多网友用很通俗的比喻 把同步和异 ...

最新文章

  1. 挨踢人生路--记我的10年18家工作经历 - 后记
  2. 写了个Python脚本监控nginx进程
  3. [Diary][pic]毕业聚餐-笑容灿烂
  4. 微前端之qiankun
  5. 4.6 高斯约当消元法
  6. 我的一点企业做云经验
  7. PostgreSQL最常见问题
  8. 2020年最具“钱途”的编程语言
  9. 4999元起!华为Mate 30 5G系列今日预售:支持SA及NSA 5G双模
  10. 【node内存泄漏耗尽之解决方法】
  11. 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子
  12. windows下python Tkinner环境布置(包含PIL环境安装)
  13. 软考高项论文写作技巧
  14. Java开发必看!java登录界面代码
  15. 源码:winamp播放器 C++
  16. 猜数字游戏 由计算机,猜数字游戏实验报告
  17. springboot 删除路径下面所有文件_Spring boot内置Tomcat的临时目录被删除导致文件上传不了-问题解析...
  18. Jupyter Notebook又一懒人神器,拖拽生成Python代码
  19. 大一寒假集训(11)(12)---map,set
  20. 软件测试 | 测试开发 | Spring boot 之 RestTemplate访问

热门文章

  1. python连接oracle超时设置,Python连接Oracle设置过程记录
  2. pycharm 类型注释_学习Python第一步,变量与数据类型
  3. java 单开程序_java生成jar包并且单进程运行的实例
  4. linux常用分区工具,总结:Linux系统磁盘分区常用的工具
  5. iOS PUSH实现的简单步骤
  6. R语言对用电负荷时间序列数据进行K-medoids聚类建模和GAM回归
  7. Python基本类型-字典
  8. linux df -h卡成狗
  9. 2.4、Android Studio使用主题编辑器设计主题
  10. (转)Oracle 临时表用法