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. DRF序列化器的使用

    序列化器的使用 序列化器的使用分两个阶段: 在客户端请求时,使用序列化器可以完成对数据的反序列化. 在服务器响应时,使用序列化器可以完成对数据的序列化. 序列化的基本使用 使用的还是上一篇博文中使用的 ...

  2. 工具 --- Git

    Git介绍 Git是目前世界上最先进的分布式版本控制系统. git 诞生: git诞生之前当时的CVS和SVN这些集中式的版本控制系统不但速度慢,而且必须联网才可以使用.由于代码量越来越多,linus ...

  3. python-第五章习题

    5.2 def isOdd(x): if(x%2==0): return False return True x=eval(input("")) print(isOdd(x)) 5 ...

  4. luogu P3959(2017noipTG D2T2

    luogu P3959(2017noipTG D2T2 不知道为什么,这两天见了好多伪装成图的dp题,这道也是. 最短路只有40分,实际上可以从数据范围n<=12看出来是状压dp. soluti ...

  5. 线段树维护最后一个0的位置(Restore Permutation)Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)

    题意:https://codeforc.es/contest/1208/problem/D 给你长度为n的序列,s[i]的值为p[1]到p[i-1]中比p[i]小的数的和,让你求出p序列. 思路: 首 ...

  6. php学习历程1——注册、登录(面向过程、面向对象)

    首先放一张天空之城 Php入门来的第一个小项目,首先做的是一个简陋的文章管理系统.有登录.注册.文章list.添加文章.修改文章.删除文章.分页这几个小功能. 面向过程的编码 面向对象的编码 首先做的 ...

  7. T100——q查询,子母查询(汇总——明细)练习笔记

    范例: 代码: #add-point:input段落 name="ui_dialog.input" INPUT BY NAME g_master.bdate,g_master.ed ...

  8. sql之游标

    --select * from   master..sysprocessesuse testdeclare my_cursor cursor scroll dynamic --scroll表示可以向前 ...

  9. Java IO与NIO的总结、比较

    一.IO流总结 1.Java I/O主要包括如下3层次: 流式部分——最主要的部分.如:OutputStream.InputStream.Writer.Reader等 非流式部分——如:File类.R ...

  10. MySQL 数据库的备份和恢复

    1.DOS命令 mysqldump /*DOS命令生成文本文件*/ mysqldump -u username -h host -ppassword dbname [tbanme1,tbname2,. ...