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

    就是有些人循环用的是普通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循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。

  • 相关阅读:
    I NEED A OFFER!
    水题 Codeforces Round #303 (Div. 2) A. Toy Cars
    模拟 HDOJ 5099 Comparison of Android versions
    模拟 HDOJ 5095 Linearization of the kernel functions in SVM
    贪心 HDOJ 5090 Game with Pearls
    Kruskal HDOJ 1863 畅通工程
    Kruskal HDOJ 1233 还是畅通工程
    并查集 HDOJ 1232 畅通工程
    DFS/并查集 Codeforces Round #286 (Div. 2) B
    水题 Codeforces Round #286 (Div. 2) A Mr. Kitayuta's Gift
  • 原文地址:https://www.cnblogs.com/suneryong/p/6520442.html
Copyright © 2011-2022 走看看