1. 程式人生 > >List 四種遍歷方法測試

List 四種遍歷方法測試

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、未完待續…