• 【Java基础系列】循环与迭代


    1. for循环

    • 基本for循环

      for (int i = 0; i < 3; i++) {
      	System.out.println(i);
      }
      
    • 增强for循环
      增强for循环适用于对集合类和数组的循环。

      List<Integer> list = Arrays.asList(1, 2, 3);
      for (Integer v : list) {
          System.out.println(v);
      }
      

      对于集合类,本质上,它是基于Collection的迭代器(iterator)的简便写法。
      通过编译后的class文件可以看出还原后的代码:

      List<Integer> list = Arrays.asList(1, 2, 3);
      Iterator var3 = list.iterator();
      
      while(var3.hasNext()) {
         Integer v = (Integer)var3.next();
         System.out.println(v);
      }
      

      对于数组,编译后,依然是基本的for循环。

      //源代码
       int[] array = new int[]{1,2,3};
          for (int v : array){
              System.out.println(v);
      }
      //编译后
      int[] array = new int[]{1, 2, 3};
          int[] var3 = array;
          int var4 = array.length;
      
          for(int var5 = 0; var5 < var4; ++var5) {
              int v = var3[var5];
              System.out.println(v);
      }
      

    2. 迭代

    实现了Collection接口的所有集合类,都实现了迭代器(iterator),可以很方便的通过next()方法进行遍历:

    List<Integer> list = Arrays.asList(1, 2, 3);
    Iterator<Integer> iterator = list.iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
    

    🤔思考:Java中遍历集合除了for,增强forIterator,还有forEach,那么这4种遍历方法的效率如何呢?

    通过以下代码进行测试:

        public static void main(String[] args) {
            List<Integer> list = new ArrayList<>();
            int max = 10000000;
            for (int i = 0; i < max; i++) {
                list.add(i);
            }
            long start = System.currentTimeMillis();
            testFor(list);
            long end = System.currentTimeMillis();
            System.out.println(end - start);
    
            start = System.currentTimeMillis();
            testFor2(list);
            end = System.currentTimeMillis();
            System.out.println(end - start);
    
            start = System.currentTimeMillis();
            testIterator(list);
            end = System.currentTimeMillis();
            System.out.println(end - start);
    
            start = System.currentTimeMillis();
            testForEach(list);
            end = System.currentTimeMillis();
            System.out.println(end - start);
    
        }
    
        private static void testFor(List<Integer> list) {
            int i = 0;
            for (int size = list.size(); i < size; i++) {
    
            }
        }
    
        private static void testFor2(List<Integer> list) {
            for (Integer integer : list) {
    
            }
        }
    
        private static void testIterator(List<Integer> list) {
            Iterator<Integer> iterator = list.iterator();
            while (iterator.hasNext()) {
                iterator.next();
            }
        }
    
        private static void testForEach(List<Integer> list) {
            list.forEach(v -> {
    
            });
        }
    

    测试结果:

    数量for增强foriteratorforeach
    100ms0ms0ms94ms
    1000ms0ms0ms72ms
    10001ms0ms0ms88ms
    100001ms1ms1ms60ms
    1000001ms5ms2ms127ms
    10000001ms9ms6ms70ms
    100000001ms31ms7ms80ms
    1000000001ms232ms17ms280ms

    执行效率从高到底依次是:for循环、iterator、增强for循环、foreach。

    看一下编译后的class:

        private static void testFor(List<Integer> list) {
            int i = 0;
    
            for(int size = list.size(); i < size; ++i) {
            }
    
        }
    
        private static void testFor2(List<Integer> list) {
            Integer var2;
            for(Iterator var1 = list.iterator(); var1.hasNext(); var2 = (Integer)var1.next()) {
            }
    
        }
    
        private static void testIterator(List<Integer> list) {
            Iterator<Integer> iterator = list.iterator();
    
            while(iterator.hasNext()) {
                iterator.next();
            }
    
        }
    
        private static void testForEach(List<Integer> list) {
            list.forEach((v) -> {
            });
        }
    

    其中增强for循环也是被替换成了迭代器。之所以iterator的效率要比增强for高一点,在编译后增强for多了赋值操作:var2 = (Integer)var1.next(),而测试种使用的iteratorwhile,少了赋值操作。

    实际开发中,如果没有极致的性能要求,以上4种遍历方式都可以使用。

  • 相关阅读:
    华为云云耀云服务器L实例评测| 之性能测试
    Python 的运算符和语句(条件、循环、异常)基本使用指南
    40+的年龄50W+的年薪,2线城市入职名企,他曾想放弃测试?
    BGP联邦实验详解 超级超级超级超级超级详细!附有源码自取~
    我的python-web基础(Flask前后端不分类)
    批量kill进程
    Docker 匿名卷、命名卷与绑定挂载
    【收藏系列】MySQL入门总结 ——>看这一篇就够了
    如何提升固态硬盘SSD的寿命?
    C++回顾录
  • 原文地址:https://blog.csdn.net/wxgxgp/article/details/126947159