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

猜你喜欢

转载自blog.csdn.net/l_wsn/article/details/73555014