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. Oracle登录认证

    oracle 登录认证 Table of Contents 1. 简介 2. authentication_services 2.1. 不同登录方式的写法 3. sysdba角色登录认证 3.1. 无 ...

  2. druid 参数配置详解

    druid 参数配置详解 */--> druid 参数配置详解 Table of Contents 1. 初始化连接 2. 参数配置及说明 3. 注意事项 3.1. 底层连接 3.2. 空闲检查 ...

  3. Linux vi/vim命令

    转自:http://www.runoob.com/linux/linux-vim.html Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一 ...

  4. WampServer 下载以及安装问题 以及配置远程连接MYSQL

    WampServer 3.0 下载: http://dl.pconline.com.cn/download/52877-1.html 碰到的问题DDL无法添加,解决方法:MSVCR110.DLL fo ...

  5. coreDNS一直处于创建中解决

    https://blog.csdn.net/gsying1474/article/details/53256599 执行: [root@lab1 coredns]# kubectl delete -f ...

  6. springcloud随便写点

    eureka  注册注册 ribbon 负载均衡 feign  声名式client hystrix  断路器 zuul  网关,智能路由,过滤 config 集群配置 bus 分布式的节点用轻量的消息 ...

  7. koa2数据请求相关问题解决方案汇总

    前端请求后端数据,难免会遇到如下几个问题: 1⃣️跨域 2⃣️post/get,其中post请求的方式又分为多种 3⃣️后端数据返回格式(上一篇已经有讨论过,这里不再赘述) 用koa2的话,如何解决这 ...

  8. LCTF (easy-100)

    先安装跑一下,不知道为啥我这里模拟器打不开,传到手机上就可以.如下图. 一个输入框,一个按钮,随便输入提示no. 放入JEB反编译. 可以看到有6个Class.大体看一遍,b和e应该和解题无关,在类a ...

  9. 软件缺陷5C标准

    Correct(准确) :每个组成部分的描述准确,不会引起误解 Clear(清晰): 每个组成部分描述清晰,易于理解 Concise(简洁): 只包含必不可少的信息,不包括任何多余的内容 Comple ...

  10. Web比赛4

    广外2019-11-30 @广外-枯燥的抽奖 <?php #这不是抽奖程序的源代码!不许看! header("Content-Type: text/html;charset=utf-8 ...