for循环优化

一、for循环的方式

for循环主要有三种

1、底层是调用迭代器进行的(由于需要调用迭代器等方法,所以对于arrayList的使用中性能较低)(foreach)

for (Object o : list) {
    System.out.println(o);
}

2、因为每次循环都要调用list.size(),所以虽然性能比第一个高点,但还是可以优化的

for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

3、优化后的for循环,先加载size()的值,较于第二种有一定优化

for (int i = list.size() - 1; i >= 0; i--) {
            System.out.println(list.get(i));
        }

4、迭代器迭代

//使用迭代器遍历ArrayList集合
         Iterator<String> listIt = list.iterator();
         while(listIt.hasNext()){
             System.out.println(listIt.next());
        }

最后进行测试下对于ArrayList的遍历性能比较(这里测试了20个数据)

public static void main(String[] args) {

        List<String> list = Arrays.asList( "alex", "brian", "charles","aa","aa","alex", "brian", "charles","aa","aa",
                "alex", "brian", "charles","aa","aa", "alex", "brian", "charles","aa","aa");


        //507600
        long start = System.nanoTime();
        for (Object o : list) {
            System.out.println(o);
        }
        long end = System.nanoTime();
        System.out.println(end-start+"------111111111111111111");



        //240100
        long start2 = System.nanoTime();
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        long end2 = System.nanoTime();
        System.out.println(end2-start2+"------222222222222222");


        //181800
        long start3 = System.nanoTime();
        for (int i = list.size() - 1; i >= 0; i--) {
            System.out.println(list.get(i));
        }
        long end3 = System.nanoTime();
        System.out.println(end3-start3+"------3333333333333");


        //262400
        long start4 = System.nanoTime();
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        long end4 = System.nanoTime();
        System.out.println(end4-start4+"------44444444444");

        System.out.println(start);

    }

最后各个循环的用时分别为:1——507600  2——240100   3——181800   4——262400

可见for (int i = list.size() - 1; i >= 0; i--)这种方式对于ArrayList是最高效的。而第四种迭代器比第三种稍低一点,第一种底层是调用了迭代器(比迭代器多了一层调用)所以对于调用是最慢的。

上面是对于各种for循环对ArrayList的性能测试。

那么要是循环的对象是LinkedList、set性能是否一样?

采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快

采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快

从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.

而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.

aa

二、for循环的优化

看:https://blog.csdn.net/ljx1400052550/article/details/104037172

https://www.cnblogs.com/yulinlewis/p/9784693.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值