某個項目中遍歷一個List
集合,該集合比較大,大概有幾萬條數據,我使用了for
循環遍歷:java
public void readList(List<String> list) { if (list != null) { for (int i=0; i<list.size(); i++) { // do something... } } }
作測試的時候發現程序執行特別慢,找了很久找到了緣由,就是上面的方法中的問題:因爲方法參數中給定的List
集合多是ArrayList
,也多是LinkedList
。當遍歷LinkedList
的時候,若是集合很大,會出現程序執行效率慢的問題。數組
將上面的方法重構:測試
public void readList(List<String> list) { if (list != null) { Itarator<String> iter = list.iterator(): while (iter.hasNext()) { // do something... } } }
重構後程序執行確實快了很多,這源於ArrayList
和LinkedList
內部實現的區別,LinkedList
隨機讀取要比ArrayList
慢,關於ArrayList
和LinkedList
區別很少說了,其餘網站有不少異同點的比較。網站
除非遍歷的過程當中要獲取集合中元素的索引使用for
循環,不然遍歷集合儘可能使用Iterator
迭代器。code
另外,還可使用forEach
循環:索引
public void readList(List<String> list) { if (list != null) { for (String str : list) { // do something... } } }
forEach
循環是Iterator
寫法的簡化版,也不用擔憂數組越界,它的內部實現也是使用Iterator
迭代器(能夠經過反編譯後查看)。不過功能上沒有Iterator
強大,好比在forEach
調用集合的remove()
方法會致使java.util.ConcurrentModificationException
異常,因此要根據具體操做選取。rem