在Java中,for循环是很常见的。一般我们写的格式,或者IDE提供的默认模板的格式大都如下:
for (int i = 0;i < 10; i++) {
// TODO something
}
对局部变量i使用的都是i++
,可是最近在很多算法中看到使用了++i
。就很是不理解。
首先从for循环执行逻辑上去分析,发现结果从理论上来说,应该是一样的。
但是本着大佬这么做一定有他的理由的原则,我写了个demo。demo很简单,就是两个简单的for循环:
for (int i = 0;i < 10; i++) {
System.out.println(i);
}
for (int i = 0;i < 10; ++i) {
System.out.println(i);
}
从输出结果看,的的确确,就是一模一样的从0输出到9。没有任何的区别。那么,为什么呢?于是我就把两个for循环的执行时间输出出来。
- 100次,
i++
执行时间1ms,++i
执行时间1ms,两者速度一样 - 1000次,
i++
执行时间14ms,++i
执行时间6ms,++i
差不多快了1倍 - 10000次,
i++
执行时间90ms,++i
执行时间33ms,++i
差不多快了2倍
次数越多,时间差距就越明显。那么,为什么++i
的执行速度会那么快呢。
原来,因为i++
要等到对i的代码执行完毕后才会将值自增1,可是代码执行完毕后i的值就可能会变,所以需要事先计算好自增后的值,将计算结果保存在一个临时变量中,待i执行完该执行的代码后,就把这个临时变量的值赋给i,再销毁临时变量。
而++i
就不用这么麻烦,它是先对i进行自增操作,再进行其它代码的执行。所以直接将值赋值给i,不需要任何中间变量。
当次数足够大的时候,i++
申请内存空间和释放内存的操作的影响就会扩大。
所以,如果面对较多次的循环,优先考虑++i会让程序的性能获得更多的提升哦。