1. 程式人生 > >JAVA遍歷list四種方法及其效率比較

JAVA遍歷list四種方法及其效率比較

四種主要方法有:

foreach

for(Object ob : list){

}

Iterator

Iterator it = list.iterator();

while(it.hasNext()){

       Object ob = it.next();

}

loop without size

int a = list.size();

for(int i = 0; i<a; i++){

      Object o = list.get(i);

}

loop with size

for(int i = 0; i<list.size(); i++){

      Object o = list.get(i);

}

對ArrayList測試

直接用迴圈的方法,get(index)來獲取物件,是最快的方式。而且把i<list.size()放到迴圈中去判斷,會影響效率。

For Each的效率最差,用迭代器的效率也沒有很好。但只是相對而言,其實從時間上看最多也就差幾毫秒。

然而,這並不是事實的全部真相!!!

上面的測試,我們只是用了ArrayList來做為List的實現類。所以才有上面的結論。

For each其實也是用了迭代器來實現,只不過這個Iterator是Java編譯器幫我們生成的,所以我們不需要再手動去編寫。但是因為每次都要做型別轉換檢查,所以花費的時間比Iterator略長。時間複雜度和Iterator一樣,

也因為用了迭代器,所以速度上受了影響。不如直接get(index)快。

那為何get(index)會比較快呢?

因為ArrayList是通過動態陣列來實現的,支援隨機訪問,所以get(index)是很快的。迭代器,其實也是通過陣列名+下標來獲取,而且增加了邏輯,自然會比get(index)慢。

LinkedList測試分析

跟ArrayList完全不一樣了。最突出的就是get(index)的方式,隨著size的增加,急劇上升。到10萬資料量時,光遍歷時間都要三四秒,這是很可怕的。那為何會有這樣的結果呢?還是和LinkedList的實現方式有關。LinkedList是通過雙向連結串列實現的,無法支援隨機訪問。當你要向一個連結串列取第index個元素時,它需要二分後從某一端開始找,一個一個地數才能找到該元素。這樣一想,就能明白為何get(index)如此費時了。

總結

(1)對於ArrayList和size<1000的LinkedList來說,每種遍歷方式差異不大;

(2)對於size較大的LinkedList,建議使用迭代器或者foreach的方式進行遍歷,否則效率將會有明顯的差距。

綜合來看,使用foreach方法比較合適。

另外,除去效率的考慮,也應該在設計上花心思,實際上把大量的物件放入list內本身就是需要考慮的問題