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

最新文章

  1. Laravel 5.x 请求的生命周期(附源码)
  2. MVC下压缩输入的HTML内容
  3. Javascript中的apply与call详解
  4. div的一些易出错地方
  5. Linux学习进阶路线图
  6. python中str()和repr()的区别
  7. C语言 文件操作12--文件加密
  8. BZOJ 3546 Life of the Party (二分图匹配-最大流)
  9. 论文笔记之:Active Object Localization with Deep Reinforcement Learning
  10. DPDK多核多线程机制简析
  11. page.Response.WriteFile(newpath);
  12. 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
  13. Python(四):数字连珠2
  14. jquery.lazyload.js图片延迟加载(懒加载)--转载
  15. SVN使用技巧
  16. java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
  17. 商城项目整理(四)JDBC+富文本编辑器实现商品增加,样式设置,和修改
  18. hud 2577 How to Type
  19. 冒泡排序(Bubble Sort)
  20. LinkedList源码

热门文章

  1. ResourceUtils 创建资源目录工具类
  2. 怎么去检测浏览器支不支持html5和css3?
  3. 机器学习之DBSCAN聚类算法
  4. C# 程序的关闭 讲究解释
  5. Selenium 2自动化测试实战35(HTML测试报告)
  6. Linux下Apache虚拟主机配置
  7. ASP.NET Core 入门笔记6,ASP.NET Core MVC 视图传值入门
  8. GitHub项目精选(持续更新)
  9. 深入理解C语言-接口封装设计思想
  10. pandas - parse-date