笔记--Java的for循环中i++和++i的区别
今天在学习HashMap源码的时候,看到人家写的for循环里用的是++i,但是自己对代码的逻辑理解觉得应该是i++,平时写for循环也都是i++,于是就上网查了下for循环里的++i和i++的区别,有人说这两个在for循环里执行是一样的,于是抱着将信将疑的态度自己动手写了个for循环输出了下试试,结果果然是一样的。后来就接着上网查这两种写法的区别,找了几篇文章总结如下:
参考文章:
https://blog.csdn.net/github_37847975/article/details/77369851
https://blog.csdn.net/zy1691/article/details/4849808
首先我们应该都知道++i与i++的区别是: ++i 是先执行 i=i+1 再使用 i 的值,而 i++ 是先使用 i 的值再执行 i=i+1;
然后我们也知道for循环的执行顺序如下:
for(A;B;C) { D; }
1.进入循环执行A;//只是进入的时候执行.
2.执行B;//条件为真才执行D,不然就跳出for了.
3.执行D;
4.执行C;
5.再回到第2步开始执行
接着看下面的实例:
1.for(int i=0; i<10; i++)
for(int i = 0; i<10; i++) { System.out.println(i); }
相当于:
for(int i=0; i<10;) { System.out.println(i); i++; }
2.for(int i=0; i<10; ++i)
for(int i = 0; i<10; ++i) { System.out.println(i); }
相当于:
for(int i=0; i<10;) { System.out.println(i); ++i; }
在上述的循环体中,i++ 和 ++i 的作用是一样的。
然而到这步我们也只是知道了作用效果是一样,但是他们肯定是有一定区别的,得出的结果是:
i++由于是在使用当前值之后再+1,所以会需要一个临时变量来转储,而++则直接+1,不存在这样的问题,也就是说i++语句是需要一个临时变量取存储返回自增前的值,而++i不需要。
对于两者的执行效率,接着往下看,网上有两种结果:
一种结论是执行相同的次数,++i的效率要优于i++的效率;
另一种结论是在没有编译器优化的情况下,++i更好。优化过后两者都一样,看起来似乎喜欢怎样写都无所谓了。 但是如果这里的i不是int而是迭代器,那么++在前和在后就会有所不同,使用++i将会有切实的更高的效率。虽然int情况下没多少区别,但为了语法上的统一,最好一律改用++i这种形式。 所以,建议在这种地方一律改用++i的形式。
对于以上的结论,总之改用++i的形式就得了。
于是本人也做了个例子:
执行100次的时候:
int c = 0; long st = System.nanoTime(); for (int i = 0; i < 100; i++) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=4950 times:1614 ------------------------------------------- 改成++i: int c = 0; long st = System.nanoTime(); for (int i = 0; i < 100; ++i) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=4950 times:1520
执行1000次的时候:
int c = 0; long st = System.nanoTime(); for (int i = 0; i < 1000; i++) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=499500 times:12399 ---------------------------------------------------- int c = 0; long st = System.nanoTime(); for (int i = 0; i < 1000; ++i) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=499500 times:11135
执行10000次的时候:
int c = 0; long st = System.nanoTime(); for (int i = 0; i < 10000; i++) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=49995000 times:117984 -------------------------------------- int c = 0; long st = System.nanoTime(); for (int i = 0; i < 10000; ++i) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=49995000 times:117968
结论:注意本人测试的时间都是纳秒(因为毫秒结果输入是0),而且比较的结果几乎没有影响,所以在此本人认为这两者的效率我更赞同结论二,在int情况下是没有什么区别的,但还是建议改用++i的形式。