笔记--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的形式。
还没有评论,来说两句吧...