Java性能優化:遍歷

說說本身踩到的坑

某個項目中遍歷一個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...
		}
	}
}

重構後程序執行確實快了很多,這源於ArrayListLinkedList內部實現的區別,LinkedList隨機讀取要比ArrayList慢,關於ArrayListLinkedList區別很少說了,其餘網站有不少異同點的比較。網站

總結一下

除非遍歷的過程當中要獲取集合中元素的索引使用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

相關文章
相關標籤/搜索