1. 程式人生 > >List遍歷:for,foreach還是Iterator?

List遍歷:for,foreach還是Iterator?

array img 發現 結構 需要 級別 索引 process arraylist

轉自:http://blog.csdn.net/nazir2513/article/details/51168345 先說現象: 如果是 ArrayList,用三種方式遍歷的速度是for>Iterator>foreach,但基本上屬於同一個速度級別; 如果是 LinkedList,則三種方式遍歷的差距很大了,用for遍歷的效率遠遠落後於foreach和Iterator,Iterator>foreach>>>for; 模擬50000條數據,放入ArrayList和LinkedList,對兩個List分別用三種方式進行遍歷,耗時如下圖所示: 技術分享圖片 這裏寫圖片描述 究其原因:   首先發現foreach和Iterator基本上都在一個速度級別,但Iterator會稍稍快於foreach,事實上,foreach就是基於Iterator實現的。也就是說下面兩段代碼效果是一樣的:所以foreach和Iterator基本是效率相當的,但foreach比Iterator慢的時間我猜測就是foreach隱式轉換成Iterator所消耗的時間,所以接下去我們就撇開foreach了不談了   2:接下來要解釋的是為什麽ArrayList的遍歷中for比Iterator快,而LinkedList中卻是Iterator遠快於for?   這得從ArrayList和LinkedList兩者的數據結構說起了: ArrayList是基於索引(index)的數組,索引在數組中搜索和讀取數據的時間復雜度是O(1),但是要增加和刪除數據卻是開銷很大的,因為這需要重排數組中的所有數據。 LinkedList的底層實現則是一個雙向循環帶頭節點的鏈表,因此LinkedList中插入或刪除的時間復雜度僅為O(1),但是獲取數據的時間復雜度卻是O(n)。 明白了兩種List的區別之後,就知道,ArrayList用for循環隨機讀取的速度是很快的,因為ArrayList的下標是明確的,讀取一個數據的時間復雜度僅為O(1)。但LinkedList若是用for來遍歷效率很低,讀取一個數據的時間復雜度就達到了為O(n)。而用Iterator的next()則是順著鏈表節點順序讀取數據的效率就很高了。   最後總結:       1:ArrayList用三種遍歷方式都差得不算太多,一般都會用for或者foreach,因為Iterator寫法相對復雜一些。當然在三種都能實現的情況下,具體用那種方式,原則就是:看你的心情。。。       2:LinkedList的話,我會毫無疑問用foreach或者Iterator。       3:有理解不到位的,歡迎請指正!

List遍歷:for,foreach還是Iterator?