List 四種遍歷方法測試
阿新 • • 發佈:2019-01-25
List 一共有四種for迴圈stackoverflow,如下,四種迴圈的簡單的效能測試方法見下面程式碼,簡單的得到結論,使用最常用的for迴圈效率是最高的。
結果:
forEachTest:48687724
iteratorTest:44456424
iterator2Test:45406589
normalTest:7648871
程式清單
class TraverseList { private static long stratTime = 0L; private static long endTime = 0L; public static void iteratorTest(List<String> list) { stratTime = System.nanoTime(); Iterator<String> it = list.iterator(); while (it.hasNext()) { it.next(); } endTime = System.nanoTime(); System.out.println("iteratorTest:" + (endTime - stratTime)); } public static void forEachTest(List<String> list) { stratTime = System.nanoTime(); for (String tmp : list) { } endTime = System.nanoTime(); System.out.println("forEachTest:" + (endTime - stratTime)); } public static void normalTest(List<String> list) { stratTime = System.nanoTime(); for (int i = 0; i < list.size(); i++) { } endTime = System.nanoTime(); System.out.println("normalTest:" + (endTime - stratTime)); } public static void iterator2Test(List<String> list) { stratTime = System.nanoTime(); for (Iterator<String> it = list.iterator(); it.hasNext();) { it.next(); } endTime = System.nanoTime(); System.out.println("iterator2Test:" + (endTime - stratTime)); } }; public class ListTest { public static void main(String[] args) { // testStringUtils(); int i = 1000000; List<String> list = new ArrayList<String>(1000000); while (i-- > 0) { list.add("test" + i); } TraverseList.forEachTest(list); TraverseList.iteratorTest(list); TraverseList.iterator2Test(list); TraverseList.normalTest(list); } }
其他關於四種方式的使用規則。
1、如果需要刪除list裡面的資料,那麼請使用iterator,使用id.remove();
2、forEach 對於陣列,不能方便的訪問下標值;對於集合,與使用Interator相比,不能方便的刪除集合中的內容.除了簡單遍歷並讀取其中的內容外,不建議使用增強的for迴圈,考慮到效能問題,也不建議使用,但是如果是遍歷的一個比較小的集合,那麼可以考慮使用,可以精簡程式碼。foreach裡頭的的 temp變數只是一個區域性變數,而且還是集合中元素的一個副本,並不是元素本身。因此容易引起寫實效。例子如下:
public static void testForEachWriterInvalid() { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); for (Integer tmp : list) { if (tmp == 1) { tmp = tmp * 2; } } for (Integer tmp : list) { System.out.println(tmp ); } }
3、未完待續…