foreach是同步还是异步JAVA,Java中foreach与正常for循环效率对比
在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循环效率对比相关推荐
- 【Promise】入门-同步回调-异步回调-JS中的异常error处理-Promis的理解和使用-基本使用-链式调用-七个关键问题
文章目录 1. 预备知识 1.1 实例对象与函数对象 1.2 两种类型的回调函数 1. 同步回调 2. 异步回调 1.3 JS中的异常error处理 1. 错误的类型 2. 错误处理(捕获与抛出) 3 ...
- JAVA面试中问及Hibernate与 Mybatis的对比
我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...
- JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)
hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加 ...
- JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结
我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...
- 计算机同步与异步的概念,同步与异步到底是什么???
总得来说,同步异步出现在以下几个领域: 1 计算机网络. 数据通信技术中有同步通信与异步通信.同步通信简单的说就是你在发送数据时候我必须同时接受.这个过程有精确的时钟控制.而异步通信是你在发数据时候 ...
- Java面试题:SSH和SSM原理对比总结以及牵扯到的面试问题
当下流行的两种企业开发MVC开源框架,是我们Java程 序猿必备知识能力.MVC是Model-View-Controller的简写."Model" 代表的是应用的业务逻辑dao层. ...
- JavaScript中foreach()用法及使用的坑
JavaScript中foreach()用法及使用的坑 JavaScript中foreach是用于遍历数组的方法,将遍历到的元素传递给回调函数,遍历的数组不能是空的要有值. foreach 语法: [ ...
- 浅析C#中foreach引用变量
昨天做老师的网站作业.要对一些对象做添加修改删除处理.别的倒没什么,删除时出现了点问题似的. 因为是从一个类的集合中删除掉一个元素.这样就要遍历整个集合,而foreach正是为遍历准备的新玩意.自然而 ...
- java 同步异步_Java中的同步于异步
java异步同步应用 所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回.所以异步的同义语是非阻塞(None Blocking). 网上有很多网友用很通俗的比喻 把同步和异 ...
最新文章
- 挨踢人生路--记我的10年18家工作经历 - 后记
- 写了个Python脚本监控nginx进程
- [Diary][pic]毕业聚餐-笑容灿烂
- 微前端之qiankun
- 4.6 高斯约当消元法
- 我的一点企业做云经验
- PostgreSQL最常见问题
- 2020年最具“钱途”的编程语言
- 4999元起!华为Mate 30 5G系列今日预售:支持SA及NSA 5G双模
- 【node内存泄漏耗尽之解决方法】
- 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子
- windows下python Tkinner环境布置(包含PIL环境安装)
- 软考高项论文写作技巧
- Java开发必看!java登录界面代码
- 源码:winamp播放器 C++
- 猜数字游戏 由计算机,猜数字游戏实验报告
- springboot 删除路径下面所有文件_Spring boot内置Tomcat的临时目录被删除导致文件上传不了-问题解析...
- Jupyter Notebook又一懒人神器,拖拽生成Python代码
- 大一寒假集训(11)(12)---map,set
- 软件测试 | 测试开发 | Spring boot 之 RestTemplate访问
热门文章
- python连接oracle超时设置,Python连接Oracle设置过程记录
- pycharm 类型注释_学习Python第一步,变量与数据类型
- java 单开程序_java生成jar包并且单进程运行的实例
- linux常用分区工具,总结:Linux系统磁盘分区常用的工具
- iOS PUSH实现的简单步骤
- R语言对用电负荷时间序列数据进行K-medoids聚类建模和GAM回归
- Python基本类型-字典
- linux df -h卡成狗
- 2.4、Android Studio使用主题编辑器设计主题
- (转)Oracle 临时表用法