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


前言
從JDK1.5起,增加了新功能Foreach,它是for循環遍歷數據的一種簡寫形式,使用的關鍵字依然是for,但參數格式不同。其詳細用法為:

for(Type e:collection){ //對變量e的使用
}

參數說明:
e:其類型Type是集合或數組中元素值的類型,該參數是集合或數組collection中的一個元素。
collections: 要遍歷的集合或數組,也可以是迭代器。

很多時候我們很自然的認為,for循環的時候使用foreach和原來的for循環用下標的方式遍歷是相同的。

而且因為foreach循環寫法簡單,很容易理解,而且少去了很多麻煩的變量,所以估計在學會使用foreach循環之后,很多人就沒有用過下標的循環了。

但是你知道兩者其實還是有很大區別的,在不同的情況下面應該使用不同的方式去循環。

否則會導致循環的時間變長。數據量小的時候當然沒有什么關系,但是一旦數據量大了之后問題就會暴露出來了。

首先我們要知道的時候foreach循環是利用迭代器的使用循環。那么什么是迭代器呢?

提供一種方法訪問一個容器對象的各個元素,同時又無需暴露該對象的內部細節,這是設計模式中的一種解釋。

forint i:list) for(Iterator<Integer> i=list.iterator();i.hasNext();)

上面兩種寫法意思其實是一樣的

其實就是利用了hasNext方法實現了foreach循環

知道了什么是foreach循環,那么什么時候去使用,也就好解釋了。

然后需要知道的是什么是RandomAccess接口,ArrayList數組實現了這個接口,這個接口是隨機存取接口。

實現了這個接口就表示內部的存放是隨機的,但是foreach循環需要需要使用next方法獲取下一個元素,而隨機存放的話就需要強制建立前后的聯系。

所以在循環ArrayList的時候使用下標去循環會比foreach循環要快。

下面說List<>,對於這個鏈表類似的有很多數據結構,LinkedList什么的,很多,他們存放本身就是有聯系的,所以對於他們來說,next方法很容易就找到下一個元素的了,所以循環的時候使用foreach很快。

public class Test { public static void main(String[] args) { //實例化arrayList
        List<Integer> arrayList = new ArrayList<Integer>(); //實例化linkList
        List<Integer> linkList = new LinkedList<Integer>(); //插入10萬條數據
        for (int i = 0; i < 100000; i++) { arrayList.add(i); linkList.add(i); } Integer array = 0; //用for循環arrayList
        long arrayForStartTime = System.currentTimeMillis(); for (int i = 0; i < arrayList.size(); i++) { array = arrayList.get(i); } long arrayForEndTime = System.currentTimeMillis(); System.out.println("用for循環arrayList 10萬次花費時間:" + (arrayForEndTime - arrayForStartTime) + "毫秒"); //用foreach循環arrayList
        long arrayForeachStartTime = System.currentTimeMillis(); for (Integer in : arrayList) { array = in; } long arrayForeachEndTime = System.currentTimeMillis(); System.out.println("用foreach循環arrayList 10萬次花費時間:" + (arrayForeachEndTime - arrayForeachStartTime) + "毫秒"); //用for循環linkList
        long linkForStartTime = System.currentTimeMillis(); Integer link = 0; for (int i = 0; i < linkList.size(); i++) { link = linkList.get(i); } long linkForEndTime = System.currentTimeMillis(); System.out.println("用for循環linkList 10萬次花費時間:" + (linkForEndTime - linkForStartTime) + "毫秒"); //用froeach循環linkList
        long linkForeachStartTime = System.currentTimeMillis(); for (Integer in : linkList) { link = in; } long linkForeachEndTime = System.currentTimeMillis(); System.out.println("用foreach循環linkList 10萬次花費時間:" + (linkForeachEndTime - linkForeachStartTime) + "毫秒"); } }

運行結果:

用for循環arrayList 10萬次花費時間:2毫秒
用foreach循環arrayList 10萬次花費時間:6毫秒
用for循環linkList 10萬次花費時間:4244毫秒
用foreach循環linkList 10萬次花費時間:2毫秒

可以看出,循環ArrayList時,普通for循環比foreach循環花費的時間要少一點;循環LinkList時,普通for循環比foreach循環花費的時間要多很多。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM