先上代码

package com.test;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; public class Testttt {
public static void main(String[] args) {
// 实例化
List<String> stringLinkedList = new LinkedList<String>();
List<String> stringArrayList = new ArrayList<String>();
// 插入数据
for (int i = 0; i < 100000; i++) {
stringLinkedList.add(String.valueOf(i));
stringArrayList.add(String.valueOf(i));
}
String a = null;
// 1、用for循环遍历ArrayList
long forArrayMillis = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
a = stringArrayList.get(i);
}
System.err.println("用for循环遍历ArrayList,耗时:" + String.valueOf(System.currentTimeMillis() - forArrayMillis) + "ms");
// 2、用foreach循环遍历ArrayList
long foreachArrayMillis = System.currentTimeMillis();
for (String string : stringArrayList) {
a = string;
}
System.err.println("用foreach循环遍历ArrayList,耗时:" + String.valueOf(System.currentTimeMillis() - foreachArrayMillis) + "ms");
// 3、用for循环遍历LinkedList
long forLinkedMillis = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
a = stringLinkedList.get(i);
}
System.err.println("用for循环遍历LinkedList,耗时:" + String.valueOf(System.currentTimeMillis() - forLinkedMillis) + "ms");
// 4、用foreach循环遍历LinkedList
long foreachLinkedMillis = System.currentTimeMillis();
for (String string : stringLinkedList) {
a = string;
}
System.err.println("用foreach循环遍历LinkedList,耗时:" + String.valueOf(System.currentTimeMillis() - foreachLinkedMillis) + "ms");
} }

结果如下:

本次测试工10W条数据

通过控制台输出的结果可以看出,

  循环遍历ArrayList集合时,for和foreach的耗时时间差不多,多次测试可以发现,for循环效率比foreach的效率还要高一些;

  循环遍历LinkedList集合时,for循环的耗时明显高于foreach循环的耗时。

结论:当遍历数组结构的集合时用for或者foreach都行

(1、在固定长度或者长度不需要计算的时候for循环效率高于foreach;2、在不确定长度或者计算长度有损性能的时候用foreach比较方便--可以自己测试一下),

当遍历链表结构的集合时一定不要用for循环。

注:在《阿里巴巴Java开发手册终极版》有下面一条需要注意的

可以测试一下,在 foreach 循环中 add/remove 集合元素,有时会抛出 ConcurrentModificationException 异常

for循环和foreach循环遍历集合的效率比较的更多相关文章

  1. Java forEach 方式遍历集合(Java 8 新特性)

    JDK 8 新增 forEach 方式遍历集合,这种方式比原来的 for each 循环还要简洁和便利. 需要注意:如果你计算机安装的是 JDK 8 以前的版本,是不支持 JDK 8 的新特性 Lis ...

  2. Java for循环和foreach循环的性能比较

    就是有些人循环用的是普通for循环,有些人用的是foreach循环,它们之间有什么区别?应该在什么时候使用这两种循环了? 两种循环的语法格式: 普通for循环语法: for (int i = 0; i ...

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

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

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

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

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

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

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

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

  7. 有关集合的foreach循环里的add/remove

    转自:Hollis(微信号:hollischuang) 在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体原因,本文就来深入分析一下该规定背后的思考. 1 .foreach循环 ...

  8. IT兄弟连 Java语法教程 数组 使用foreach循环遍历数组元素

    从JDK5之后,Java提供了一种更简单的循环:foreach循环,也叫作增强for循环,这种循环遍历数组和集合更加简洁.使用foreach循环遍历数组和集合元素时,无需获得数组或集合的长度,无需根据 ...

  9. 二维数组遍历的方式(for普通循环遍历、foreach循环遍历、toString方式遍历)

    package com.Summer_0421.cn; import java.lang.reflect.Array; import java.util.Arrays; /** * @author S ...

随机推荐

  1. 死磕 java集合之ArrayList源码分析

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可 ...

  2. 【Docker】(4)搭建私有镜像仓库

    [Docker](4)搭建私有镜像仓库 说明 1. 这里是通过阿里云,搭建Docker私有镜像仓库. 2. 这里打包的镜像是从官网拉下来的,并不是自己项目创建的新镜像,主要测试功能 一.搭建过程 首先 ...

  3. https和http共存的nginx简单配置

    server{ listen 80; listen 443 ssl; ssl_certificate /usr/local/nginx/ssl/www.demo.com/www.demo.com.cn ...

  4. Chapter 5 Blood Type——30

    That wasn't a challenge; I was always pale, and my recent swoon had left a light sheen of sweat on m ...

  5. 使用MQ来保证分布式事务的最终一致性

    前言 之前我们讨论了如何拆分一个订单下单的一个服务(https://www.cnblogs.com/linkstar/p/9610268.html) 从单体到微服务的拆分,当时我们只是对原来的整个服务 ...

  6. docker 安装LAMP环境

    LAMP:Linux.Apache.MySQL.PHP docker hub 上会有配好的LAMP环境docker,部署到本地并运行起来 sudo docker pull linode/lamp 然后 ...

  7. NET快速信息化系统开发框架 V3.2 ->WinForm部分全部重构为Dev风格界面

    RDIFrameowrk.NET V3.2以前的版本WinForm部分使用的界面控件是DotNetBar,界面也是非常的美女,但相比现在市面上用得非常多功能强大的Dev控件还是略显逊色,V3.2版本花 ...

  8. SLAM入门之视觉里程计(1):特征点的匹配

    SLAM 主要分为两个部分:前端和后端,前端也就是视觉里程计(VO),它根据相邻图像的信息粗略的估计出相机的运动,给后端提供较好的初始值.VO的实现方法可以根据是否需要提取特征分为两类:基于特征点的方 ...

  9. 使用开源项目Alipay.AopSdk.Core完成支付宝网页登录

    核心方法: public IActionResult UserInfoCallBackAli() { var alipayClient = new DefaultAopClient(ConfigAli ...

  10. 【苹果通知APNs】不知道大家用过PushSharp没?

    好久没写东西了,近期在研究Jenkins,大家有兴趣可以一起来玩玩交流,学习DevOps还是蛮重要. 近期我负责的项目里需要APNs的通知,这个自己单独开发还是蛮费功夫,故用了第三方开源的PushSh ...