zoukankan      html  css  js  c++  java
  • java中三种for循环之间的对比

    普通for循环语法:

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

    foreach 循环语法:

    1 for(Integer in : integers){  
    2     System.out.println(in);  
    3 }  

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

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

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

    下面是我测试的代码:

     1 package cn.migu.newportal.activity.service.activity;
     2 
     3 import java.util.ArrayList;
     4 import java.util.LinkedList;
     5 import java.util.List;
     6 
     7 /**
     8  *
     9  * @author 
    10  * @version C10 2017年11月30日
    11  * @since SDP V300R003C10
    12  */
    13 public class Test
    14 {
    15     public static void main(String[] args)
    16     {
    17         
    18         // 实例化arrayList
    19         List<Integer> arrayList = new ArrayList<Integer>();
    20         // 实例化linkList
    21         List<Integer> linkList = new LinkedList<Integer>();
    22         
    23         // 插入10万条数据
    24         for (int i = 0; i < 100000; i++)
    25         {
    26             arrayList.add(i);
    27             linkList.add(i);
    28         }
    29         
    30         int array = 0;
    31         // 用for循环arrayList
    32         long arrayForStartTime = System.currentTimeMillis();
    33         for (int i = 0; i < arrayList.size(); i++)
    34         {
    35             array = arrayList.get(i);
    36         }
    37         long arrayForEndTime = System.currentTimeMillis();
    38         System.out.println("用for循环arrayList 10万次花费时间:" + (arrayForEndTime - arrayForStartTime) + "毫秒");
    39         
    40         // 用foreach循环arrayList
    41         long arrayForeachStartTime = System.currentTimeMillis();
    42         for (Integer in : arrayList)
    43         {
    44             array = in;
    45         }
    46         long arrayForeachEndTime = System.currentTimeMillis();
    47         System.out.println("用foreach循环arrayList 10万次花费时间:" + (arrayForeachEndTime - arrayForeachStartTime) + "毫秒");
    48         
    49         // 用for循环linkList
    50         long linkForStartTime = System.currentTimeMillis();
    51         int link = 0;
    52         for (int i = 0; i < linkList.size(); i++)
    53         {
    54             link = linkList.get(i);
    55         }
    56         long linkForEndTime = System.currentTimeMillis();
    57         System.out.println("用for循环linkList 10万次花费时间:" + (linkForEndTime - linkForStartTime) + "毫秒");
    58         
    59         // 用froeach循环linkList
    60         long linkForeachStartTime = System.currentTimeMillis();
    61         for (Integer in : linkList)
    62         {
    63             link = in;
    64         }
    65         long linkForeachEndTime = System.currentTimeMillis();
    66         System.out.println("用foreach循环linkList 10万次花费时间:" + (linkForeachEndTime - linkForeachStartTime) + "毫秒");
    67     }
    68 }

    循环10万次的时候,控制台打印结果:  (结果每次都会变,但求个平均值还是可以分析出结果的)

    用for循环arrayList 10万次花费时间:6毫秒
    用foreach循环arrayList 10万次花费时间:7毫秒
    用for循环linkList 10万次花费时间:20489毫秒
    用foreach循环linkList 10万次花费时间:8毫秒

    可以看出,循环ArrayList时,普通for循环比foreach循环花费的时间要少一点;循环LinkList时,普通for循环比foreach循环花费的时间要多很多。

    当我将循环次数提升到一百万次的时候,循环ArrayList,普通for循环还是比foreach要快一点;但是普通for循环在循环LinkList时,程序直接卡死。

    结论:需要循环数组结构的数据时,建议使用普通for循环,因为for循环采用下标访问,对于数组结构的数据来说,采用下标访问比较好。

    需要循环链表结构的数据时,一定不要使用普通for循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。

    网上参考一种代码更紧凑的写法:

    实体Person类

     1 package cn.migu.newportal.activity.service.activity;
     2 
     3 /**
     4  *
     5  * @author 
     6  * @version C10 2017年11月30日
     7  * @since SDP V300R003C10
     8  */
     9 public class Person
    10 {
    11     private String a;
    12     
    13     private int b;
    14     
    15     public Person(String a, int b)
    16     {
    17         super();
    18         this.a = a;
    19         this.b = b;
    20     }
    21     
    22     public String getA()
    23     {
    24         return a;
    25     }
    26     
    27     public void setA(String a)
    28     {
    29         this.a = a;
    30     }
    31     
    32     public int getB()
    33     {
    34         return b;
    35     }
    36     
    37     public void setB(int b)
    38     {
    39         this.b = b;
    40     }
    41     
    42 }

    测试ArrayList的主程序:

     1 package com.zhang.loop;  
     2   
     3 import java.util.ArrayList;  
     4 import java.util.Iterator;  
     5 import java.util.LinkedList;  
     6 import java.util.List;  
     7   
     8 public class TestArrayList {  
     9     private static final int COUNT = 800000;  
    10     private static List<Person> persons = new ArrayList<Person>();  
    11       
    12     public static void main(String[] args) {  
    13         init();  
    14         System.out.println("for循环测试结果:"+testFor());  
    15         System.out.println("foreach循环测试结果:"+testForeach());  
    16         System.out.println("iterator循环测试结果:"+testIterator());  
    17     }  
    18       
    19     //初始化集合  
    20     public static void init(){  
    21         for (int i = 0; i <COUNT; i++) {  
    22             persons.add(new Person("第"+i+"个元素",i));  
    23         }  
    24     }  
    25     //for循环便利集合  
    26     public static long testFor(){  
    27         long start = System.nanoTime();  
    28         Person p = null;  
    29         for (int i = 0; i < persons.size(); i++) {  
    30             p = persons.get(i);  
    31         }  
    32         return (System.nanoTime()-start)/1000;  
    33     }  
    34     //foreach循环便利集合  
    35     public static long testForeach(){  
    36         long start = System.nanoTime();  
    37         Person p = null;  
    38         for (Person person : persons) {  
    39             p = person;  
    40         }  
    41         return (System.nanoTime()-start)/1000;  
    42     }  
    43     //iterator循环便利集合  
    44     public static long testIterator(){  
    45         long start = System.nanoTime();  
    46         Person p = null;  
    47         Iterator<Person> itreator = persons.iterator();  
    48         while(itreator.hasNext()){  
    49             p = itreator.next();  
    50         }  
    51         return (System.nanoTime()-start)/1000;  
    52     }  
    53       
    54 }  

    ArrayList测试结果:

    测试LinkedList的主程序:

     1 package com.zhang.loop;  
     2   
     3 import java.util.ArrayList;  
     4 import java.util.Iterator;  
     5 import java.util.LinkedList;  
     6 import java.util.List;  
     7   
     8 public class TestArrayList {  
     9     private static final int COUNT = 8000;  
    10     private static List<Person> persons = new LinkedList<Person>();  
    11       
    12     public static void main(String[] args) {  
    13         init();  
    14         System.out.println("for循环测试结果:"+testFor());  
    15         System.out.println("foreach循环测试结果:"+testForeach());  
    16         System.out.println("iterator循环测试结果:"+testIterator());  
    17     }  
    18       
    19     //初始化集合  
    20     public static void init(){  
    21         for (int i = 0; i <COUNT; i++) {  
    22             persons.add(new Person("第"+i+"个元素",i));  
    23         }  
    24     }  
    25     //for循环便利集合  
    26     public static long testFor(){  
    27         long start = System.nanoTime();  
    28         Person p = null;  
    29         for (int i = 0; i < persons.size(); i++) {  
    30             p = persons.get(i);  
    31         }  
    32         return (System.nanoTime()-start)/1000;  
    33     }  
    34     //foreach循环便利集合  
    35     public static long testForeach(){  
    36         long start = System.nanoTime();  
    37         Person p = null;  
    38         for (Person person : persons) {  
    39             p = person;  
    40         }  
    41         return (System.nanoTime()-start)/1000;  
    42     }  
    43     //iterator循环便利集合  
    44     public static long testIterator(){  
    45         long start = System.nanoTime();  
    46         Person p = null;  
    47         Iterator<Person> itreator = persons.iterator();  
    48         while(itreator.hasNext()){  
    49             p = itreator.next();  
    50         }  
    51         return (System.nanoTime()-start)/1000;  
    52     }  
    53       
    54 }  

    LinkedList测试结果:

    记录的存取方式有两种:

                 一种是顺序存储(数组,ArrayList..)可以根据其下标找到对应的记录

                另一种是链接存储(LinkedList..)链接存储(拿单链表为例)则必须找到其前一个记录的位置才能够找到本记录。

    根据以上可以得到的结果是:for循环便于访问顺序存储的记录而foreach和迭代器便于访问链接存储

  • 相关阅读:
    20200302 数据分析之numpy以及Jupyter
    20200228 scrapy高级使用及分布式
    20200226 请求库selenium
    20200224 爬虫-requests模块
    0219 请求上下文解析与g对象
    Matlab矩阵求导和求梯度有什么不同
    矩阵中范数的处理方式
    如何巧妙地使用递归
    遗传算法求最短路径
    nparray的维度和取值方式
  • 原文地址:https://www.cnblogs.com/jiliunyongjin/p/7927785.html
Copyright © 2011-2022 走看看