zoukankan      html  css  js  c++  java
  • Java: For循环那些事


    title: Java-for循环那些事
    toc: true
    date: 2019-05-21 10:28:44
    categories: Java
    tags:
    - Tips

    Java for循环里面的 i++++i

    在for循环里两者的作用是一样的

    i++

    for(int i=0; i<5; i++){
        System.out.print(i + ",");
    }
    
    >> 0, 1, 2, 3, 4
    

    ++i

    for(int i=0; i<5; ++i){
        System.out.print(i + ",");
    }
    
    >> 0, 1, 2, 3, 4
    

    工作原理

    i++

    {
        System.out.print(i + ",");
        i++;
    }
    

    ++i

    {
        System.out.print(i + ",");
        ++i;
    }
    

    区别

    在Java里面,i++ 需要开辟新的存储空间用于存储结果,++i 直接在原存储空间中存储结果。++i 在 for 循环里面执行效率要高。 可以作为代码优化的一部分。

    foreach 与 for循环的效率

    1. 首先测试数组

      // 测试for循环
      int[] A = new int[100000000];
      long startTime = System.nanoTime();
      int len = A.length;
      int res = 0;
      for(int i=0; i<len; i++){
          res += A[i];
      }
      long endTime = System.nanoTime();
      System.out.println("for循环: "+(endTime- startTime));
      
      // 测试foreach
      int[] A = new int[100000000];
      long startTime = System.nanoTime();
      int len = A.length;
      int res = 0;
      for(Integer i: A){
          res += i;
      }
      long endTime = System.nanoTime();
      System.out.println("foreach循环: "+(endTime- startTime));
      

      结果

      for循环: 37143324
      forecah循环: 75450311
      

      可见对于大数组采用for循环效率更高

    2. 再测试ArrayList

      ArrayList<Integer> list = new ArrayList<>(30000000);
          for(int i=0; i<30000000; i++){
              list.add(i);
          }
      // 测试for循环
      long startTime = System.nanoTime();
      int size = list.size();
      int res = 0;
      for(int i=0; i<size; i++){
          res += list.get(i);
      }
      long endTime = System.nanoTime();
      System.out.println("for循环: "+(endTime- startTime));
      
      // 测试foreach
      long startTime = System.nanoTime();
      int res = 0;
      for(Integer i: list){
              res += i;
          }
      long endTime = System.nanoTime();
      System.out.println("foreach循环: "+(endTime- startTime));
      

      结果

      for循环: 39368248
      forecah循环: 42177137
      

      可见对于ArrayList仍然是采用for循环效率更高!

    for循环小技巧

    关于数组

    循环嵌套采用小套大。原理跟复制几个大文件跟复制一堆小文件耗时一样。

    测试

    long startTime = System.nanoTime();
    int res = 0;
    // 大套小
    for(int i=0; i<10000000; i++){
        for(int j=0; j<100; j++){
            res += i;
        }
    }
    long endTime = System.nanoTime();
    System.out.println("大套小: "+(endTime- startTime));
    
    // 小套大
    for(int i=0; i<100; i++){
        for(int j=0; j<10000000; j++){
            res += i;
        }
    }
    long endTime = System.nanoTime();
    System.out.println("小套大: "+(endTime- startTime));
    

    结果

    大套小: 57934223
    小套大: 4918044
    

    关于ArrayList

    在循环时,首先把ArrayList长度size记录下来

    测试

    ArrayList<Integer> list = new ArrayList<>(30000000);
    for(int i=0; i<30000000; i++){
        list.add(i);
    }
    long startTime = System.nanoTime();
    //先把长度保存下来
    int len = list.size();
    int res = 0;
    for(int i=0; i<len; i++){
        res += list.get(i);
    }
    long endTime = System.nanoTime();
    System.out.println("保存size(): "+(endTime- startTime));
    
    //没有保存size()
    for(int i=0; i<list.size(); i++){
        res += list.get(i);
    }
    long endTime = System.nanoTime();
    System.out.println("没有保存size(): "+(endTime- startTime));
    

    结果

    保存size(): 38973440
    没有保存size(): 39486862
    
  • 相关阅读:
    心情日记:【原创诗歌】怆情吟
    心情日记:2008年3月3日 奶奶去世
    心情日记:健身日记
    金融基础概念期货
    FXDD点值获利计算
    外汇基础概念汇率
    报告论文:是学生都copy下来,现在不用,将来绝对要用(转)
    情感日记:毕业临走物语
    美元为什么坚挺
    英特尔首席技术官:人机智能鸿沟将于2050年消失
  • 原文地址:https://www.cnblogs.com/SUNYZBlog/p/10924053.html
Copyright © 2011-2022 走看看