关于普通for循环和增强for循环

什么时候使用普通for循环,什么时候使用增强for循环

首先,增强for循环的写法比普通for循环简便,不过我们还得考虑效率。

--->首先,我们先看结论:

对于基本数组类的遍历,两者的效率是相同的;

对于ArrayList的遍历,普通for循环的效率高于增强for循环;

对于LinkedList的遍历,增强for循环的效率高于普通for循环。

 

--->然后,我们来看验证:

        int[] intArray = new int[100000];
        List intArrayList = new ArrayList<>();
        List intLinkedList = new LinkedList<>();
        for (int i = 0; i < 100000; i++) {
            intArray[i] = i;
            intArrayList.add(i);
            intLinkedList.add(i);
        }
        
        int a = 0;
        
        System.out.println("======遍历stringArray======");
        
        //用for循环stringArray
        long forStartTime = System.currentTimeMillis();
        for (int i = 0; i < intArray.length; i++) {
            a = intArray[i];
        }
        long forEndTime = System.currentTimeMillis();
        System.out.println("普通for循环需要:" + (forEndTime - forStartTime) + "毫秒");

        //用增强for循环stringArray
        long forUpStartTime = System.currentTimeMillis();
        for (Integer i: intArray) {
            a = i;
        }
        long forUpEndTime = System.currentTimeMillis();
        System.out.println("增强for循环需要:" + (forUpEndTime - forUpStartTime) + "毫秒");

        System.out.println("======遍历stringArrayList======");

        //用for循环stringArrayList
        long forStartTime2 = System.currentTimeMillis();
        for (int i = 0; i < intArrayList.size(); i++) {
            a = intArrayList.get(i);
        }
        long forEndTime2 = System.currentTimeMillis();
        System.out.println("普通for循环需要:" + (forEndTime2 - forStartTime2) + "毫秒");

        //用增强for循环stringArrayList
        long forUpStartTime2 = System.currentTimeMillis();
        for (Integer i: intArrayList) {
            a = i;
        }
        long forUpEndTime2 = System.currentTimeMillis();
        System.out.println("增强for循环需要:" + (forUpEndTime2 - forUpStartTime2) + "毫秒");

        System.out.println("======遍历stringLinkedList======");

        //用for循环stringLinkedList
        long forStartTime3 = System.currentTimeMillis();
        for (int i = 0; i < intLinkedList.size(); i++) {
            a = intLinkedList.get(i);
        }
        long forEndTime3 = System.currentTimeMillis();
        System.out.println("普通for循环需要:" + (forEndTime3 - forStartTime3) + "毫秒");

        //用增强for循环stringLinkedList
        long forUpStartTime3 = System.currentTimeMillis();
        for (Integer i: intLinkedList) {
            a = i;
        }
        long forUpEndTime3 = System.currentTimeMillis();
        System.out.println("增强for循环需要:" + (forUpEndTime3 - forUpStartTime3) + "毫秒");
I/System.out: ======遍历stringArray======
I/System.out: 普通for循环需要:1毫秒
I/System.out: 增强for循环需要:1毫秒
I/System.out: ======遍历stringArrayList======
I/System.out: 普通for循环需要:2毫秒
I/System.out: 增强for循环需要:2毫秒
I/System.out: ======遍历stringLinkedList======
I/System.out: 普通for循环需要:4411毫秒
I/System.out: 增强for循环需要:6毫秒

可以佐证上述结论。

并且我们尤其需要关注:

使用LinkedList时,普通for循环比增强for循环花费的时间要多很多,甚至会导致程序直接卡死。

 

写在最后:

ArrayList是采用数组的形式保存对象的,这种方式将对象放在连续的内存块中,所以插入和删除时比较麻烦,

查询比较方便。

LinkedList是将对象放在独立的空间中,而且每个空间中还保留下一个空间的索引,也就是数据结构中的链表结构,

插入和删除比较方便,但是查找很麻烦,要从第一个开始遍历。

至于为什么使用LinkedList时,普通for循环耗时比增强for循环多那么多,这是因为他们的实现不同,具体可以参考

下面这篇文章https://www.jianshu.com/p/f770ea3e7181

你可能感兴趣的:(Java)