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)會比較快呢?
因為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內本身就是需要考慮的問題