zoukankan      html  css  js  c++  java
  • Java for循环和foreach循环的性能比较

    在公司codereview过程中,发现一个问题,就是有些人循环用的是普通for循环,有些人用的是foreach循环,它们之间有什么区别?应该在什么时候使用这两种循环了?

    两种循环的语法格式:

    普通for循环语法:

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


    foreach 循环语法:

    [java] view plain copy
     
    1. for(Integer in : integers){  
    2.     System.out.println(in);  
    3. }  

     

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

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

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

    下面是我测试的代码:

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

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

    [java] view plain copy
     
    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循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。

  • 相关阅读:
    Mysql::Error: Commands out of sync; you can't run this command now: SHOW TABLES解决方案
    mysql安装失败Error Nr. 1045
    TermServDevices 报错【远程服务使用者必读】
    数据库出现“提取逻辑页失败”
    Ruby学习——数据库操作
    VS2008 安装失败
    Ubuntu Server 安装图解
    C#的Enum——枚举
    SQLServer2005数据库被置为“可疑”
    ROR之include、extend、send对module、class进行扩展
  • 原文地址:https://www.cnblogs.com/Alex0111/p/8127517.html
Copyright © 2011-2022 走看看