首先,这两个代码片段并不是无限循环,因为一旦i超过Integer.MAX_VALUE,它将变成负数。它们只需要很长时间才能运行。
第一个片段运行的时间要短得多,因为它不需要打印任何内容,并且编译器可能足够聪明,只需优化代码并消除循环,因为它什么也不做。
测试您的第一个代码片段,将System.out.println(System.currentTimeMillis());添加到循环之前和之后,我得到了:
1486539220248
1486539221124
即在1秒内运行。
稍微改变循环:
System.out.println (System.currentTimeMillis ());
for(int i = 2; i > 0; i++){
int c = 0;
if (i==Integer.MAX_VALUE)
System.out.println (i);
}
System.out.println (System.currentTimeMillis ());
I got
1486539319309
2147483647
1486539319344
正如你所看到的,从
0
开始增加到
Integer.MAX_VALUE
只需不到 1 秒钟的时间,然后会发生溢出,循环终止。
如果在循环中添加更多的打印语句,则终止所需的时间将更长。例如:
System.out.println (System.currentTimeMillis ());
for(int i = 2; i > 0; i++){
int c = 0;
if (i % 100000000 == 0)
System.out.println (i);
}
System.out.println (System.currentTimeMillis ());
输出:
1486539560318
100000000
200000000
300000000
400000000
500000000
600000000
700000000
800000000
900000000
1000000000
1100000000
1200000000
1300000000
1400000000
1500000000
1600000000
1700000000
1800000000
1900000000
2000000000
2100000000
1486539563232
现在需要花费3秒钟。
int i = Integer.MAX_VALUE; i++
,你知道会发生什么吗? - SMAInteger.MAX_VALUE
次需要一些时间。您只需达到正值的极限,然后下一个增量将给出负值。 - AxelH