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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值