最近看一些别人的源码,发现很多人使用for循环都会这么写:
for(int i=0; i<***; ++i)
首先,在for循环中的i++和++i其效果是一样的,这里不予证明。
自己写了这么多年的程序,第一次见到这种写法,只能说自己孤陋寡闻了。赶紧到网上查了下,2种写法的运行时间是有差别,因为“Java中i++语句是需要一个临时变量取存储返回自增前的值,而++i不需要。这样就导致使用i++时系统需要先申请一段内存空间,然后将值赛如进去,最后不用了才去释放。”为了证明一下此番言论的正确性,于是写了一些测试代码。
1、先来个时间短一点的:
public static void testForI() throws InterruptedException{
long startTime = System.currentTimeMillis();
for(int i=0; i<10000; i++){
System.out.print(i);
}
System.out.println();
long endTime = System.currentTimeMillis();
long usse1 = endTime-startTime;
startTime = endTime;
for(int i=0; i<10000; ++i){
System.out.print(i);
}
System.out.println();
endTime = System.currentTimeMillis();
long usse2 = endTime-startTime;
System.out.println("耗时1:"+usse1);
System.out.println("耗时2:"+usse2);
}
多次测试结果:
有一定的随机性,间隔时间相关不大,但基本上第二循环会比较节约时间。
2、增加循环次数:
多次测试结果:
可以看到,第二次循环依然会比较节约时间。
3、来个时间更长一点的测试:
public static void testForI() throws InterruptedException{
long startTime = System.currentTimeMillis();
for(int i=0; i<100000; i++){
Thread.sleep(1);
}
long endTime = System.currentTimeMillis();
long usse1 = endTime-startTime;
startTime = endTime;
System.out.println("耗时1:"+usse1);
for(int i=0; i<100000; ++i){
Thread.sleep(1);
}
endTime = System.currentTimeMillis();
long usse2 = endTime-startTime;
System.out.println("耗时2:"+usse2);
}
运行结果:
以上测试基本能证明网上比较一致的结论。
但是对于我们平时写的循环,一般循环次数较小,在时间消耗上基本不会有太多的差异,但更加重要的一点是“使用i++时系统需要先申请一段内存空间”,也就是说理论上使用i++会占用更多的内存。
当然,对于这种对于时间、空间都存在一丁点儿的差异的优化,见仁见智,喜欢怎么写就怎么写咯。