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

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

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

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

不少時候咱們很天然的認爲,for循環的時候使用foreach和原來的for循環用下標的方式遍歷是相同的。數據結構

並且由於foreach循環寫法簡單,很容易理解,並且少去了不少麻煩的變量,因此估計在學會使用foreach循環以後,不少人就沒有用過下標的循環了。dom

可是你知道二者其實仍是有很大區別的,在不一樣的狀況下面應該使用不一樣的方式去循環。spa

不然會致使循環的時間變長。數據量小的時候固然沒有什麼關係,可是一旦數據量大了以後問題就會暴露出來了。設計

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

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

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

上面兩種寫法意思實際上是同樣的blog

其實就是利用了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時,程序直接卡死。

相關文章
相關標籤/搜索