Java for循環和foreach循環的性能比較

就是有些人循環用的是普通for循環,有些人用的是foreach循環,它們之間有什麼區別?應該在何時使用這兩種循環了?java

兩種循環的語法格式:算法

普通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是將對象放在獨立的空間中,並且每一個空間中還保存下一個空間的索引,也就是數據結構中的鏈表結構,插入和刪除比較方便,可是查找很麻煩,要從第一個開始遍歷。spa

 

下面是我測試的代碼:.net

 

[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循環花費的時間要多不少。blog

 

當我將循環次數提高到一百萬次的時候,循環ArrayList,普通for循環仍是比foreach要快一點;可是普通for循環在循環LinkList時,程序直接卡死。

 

結論:須要循環數組結構的數據時,建議使用普通for循環,由於for循環採用下標訪問,對於數組結構的數據來講,採用下標訪問比較好。

須要循環鏈表結構的數據時,必定不要使用普通for循環,這種作法很糟糕,數據量大的時候有可能會致使系統崩潰。

相關文章
相關標籤/搜索