先上代碼
package com.test; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class Testttt { public static void main(String[] args) { // 實例化 List<String> stringLinkedList = new LinkedList<String>(); List<String> stringArrayList = new ArrayList<String>(); // 插入數據 for (int i = 0; i < 100000; i++) { stringLinkedList.add(String.valueOf(i)); stringArrayList.add(String.valueOf(i)); } String a = null; // 1、用for循環遍歷ArrayList long forArrayMillis = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { a = stringArrayList.get(i); } System.err.println("用for循環遍歷ArrayList,耗時:" + String.valueOf(System.currentTimeMillis() - forArrayMillis) + "ms"); // 2、用foreach循環遍歷ArrayList long foreachArrayMillis = System.currentTimeMillis(); for (String string : stringArrayList) { a = string; } System.err.println("用foreach循環遍歷ArrayList,耗時:" + String.valueOf(System.currentTimeMillis() - foreachArrayMillis) + "ms"); // 3、用for循環遍歷LinkedList long forLinkedMillis = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { a = stringLinkedList.get(i); } System.err.println("用for循環遍歷LinkedList,耗時:" + String.valueOf(System.currentTimeMillis() - forLinkedMillis) + "ms"); // 4、用foreach循環遍歷LinkedList long foreachLinkedMillis = System.currentTimeMillis(); for (String string : stringLinkedList) { a = string; } System.err.println("用foreach循環遍歷LinkedList,耗時:" + String.valueOf(System.currentTimeMillis() - foreachLinkedMillis) + "ms"); } }
結果如下:
本次測試工10W條數據
通過控制台輸出的結果可以看出,
循環遍歷ArrayList集合時,for和foreach的耗時時間差不多,多次測試可以發現,for循環效率比foreach的效率還要高一些;
循環遍歷LinkedList集合時,for循環的耗時明顯高於foreach循環的耗時。
結論:當遍歷數組結構的集合時用for或者foreach都行
(1、在固定長度或者長度不需要計算的時候for循環效率高於foreach;2、在不確定長度或者計算長度有損性能的時候用foreach比較方便--可以自己測試一下),
當遍歷鏈表結構的集合時一定不要用for循環。
注:在《阿里巴巴Java開發手冊終極版》有下面一條需要注意的
可以測試一下,在 foreach 循環中 add/remove 集合元素,有時會拋出 ConcurrentModificationException 異常