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

Java: For循环那些事的更多相关文章

  1. 第二周:Java For循环方法简介

    1.for循环的作用 Java当中循环的意思就是让Java程序重复地执行某些语句.在程序设计时,常常需要处理大量的重复动作, 采用循环结构可以降低程序书写的长度和复杂度可使复杂问题简单化,提高程序的可 ...

  2. [Java基础]循环结构3

    [Java基础]循环结构3 break 与 continue 中断循环... /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:BreakTest.java 编写时间:2016/6 ...

  3. [java基础]循环结构2

    [java基础]循环结构2 写了几个循环结构练习~记录一下~~ 1:99乘法表 /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:GameForFor.java 编写时间:2016 ...

  4. [java基础]循环结构1

    [java基础]循环结构1 循环结构:for循环,while循环,do_while循环在,增强型for循环 /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:WhileTest.j ...

  5. Java中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后在今天使用的时候发现报错了,然后去科普了一下,发现这是一个误区.下面我们来一起看一下. Java中循环遍 ...

  6. Java日志性能那些事(转)

    在任何系统中,日志都是非常重要的组成部分,它是反映系统运行情况的重要依据,也是排查问题时的必要线索.绝大多数人都认可日志的重要性,但是又有多少人仔细想过该怎么打日志,日志对性能的影响究竟有多大呢?今天 ...

  7. java集合循环删除

    java集合循环删除,java list集合操作,java循环.分享牛,分享牛原创.java集合删除方法. 2.6.1.第一种方式 list.add("1"); list.add( ...

  8. JAVA中循环删除list中元素的方法总结【转】

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...

  9. Java for-each循环解惑

    Java for-each循环解惑 2014/04/24 | 分类: 技术之外 | 0 条评论 | 标签: JAVA 分享到:21 本文由 ImportNew - liqing 翻译自 javarev ...

随机推荐

  1. 视图解析器InternalResourceViewResolver

    ModelAndView对象中即可以封装真实视图路径名,也可以封装视图路径的逻辑名,springmvc.xml 代码如下: <!-- 视图解析器(框架) --> <bean clas ...

  2. rally测试opentack------安装部署和简单实践

    1,下载 git clone git://git.openstack.org/openstack/rally 或者 git clone https://git.openstack.org/openst ...

  3. kafka整合springboot

    1.pom.xml添加依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifa ...

  4. piggy back是什么意思?

    遇到这么一句话. // Connect the Socket.IO framework up to the web server to piggy back on its connection // ...

  5. PCL点云库(Point Cloud Library)简介

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=29 什么是PCL PCL(Point Cloud Library)是在吸收了 ...

  6. 数据中心网络架构的问题与演进 — 混合云与 VPC 专有网络

    目录 文章目录 目录 前文列表 历史背景 混合云 Why hybrid cloud? 混合云市场 混合云的逻辑架构 混合云应用场景 灾难恢复 数据备份 负载扩容 应用部署 开发测试生产部署 混合云产品 ...

  7. 两种最常用的破解centos7忘掉密码的解决方案

    第一种方法:设置光盘为第一启动项 第一步:进入bios界面 虚拟机中:点击左上角的虚拟机-->电源-->打开电源时进入固件   第二步:使用左右键选择上方的boot 按住shift+ 加号 ...

  8. Linux命令集锦:tmux命令

    tmux是一款优秀的终端复用软件,平时用到的强大功能有下面两个: 窗口管理:同时启用多个窗口: 保护现场:连接到远程主机之后,一旦断开,那么当前账户登录的任务就被取消了,但是使用 tmux 可以在断开 ...

  9. maven-1-是什么

    背景 1.1. 场景 假如你正在Eclipse下开发两个Java项目,姑且把它们称为A.B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢? 很简单,这不就是跟我们之前写程 ...

  10. 那些年踩过的坑之Redis报错:All sentinels down, cannot determine where is mymaster master is running...

    1. 异常信息: All sentinels down, cannot determine where is mymaster master is running... 通过测试: @Test pub ...