日期:2014-05-20  浏览次数:20829 次

关于Integer自加的一个小疑问
我写了一个循环,测试Integer从最小值自加到最大值的执行时间,但中间发现了一个问题,就是加到最大值之后自加恢复到负最大值与手动赋值为负最大值开始下一次循环的时间不同,代码如下:

public class TestClass {
public static void main(String[] args) {
int i = Integer.MAX_VALUE;
int count = 0;
long startTime = System.currentTimeMillis();
long tempTime = startTime;
while (true) {
i++;
// if (i % 10000000 == 0) {
// System.out.println(i);
// }
if (i == Integer.MAX_VALUE) {
i = Integer.MIN_VALUE; //手动赋值
count++;
System.out.println("Finish run " + count + " times loop, cost "
+ (System.currentTimeMillis() - tempTime) + " ms.");
tempTime = System.currentTimeMillis();
}
if (count == 10) {
break;
}
}
System.out.println("Total cost " + (System.currentTimeMillis() - startTime) / 1000 + " s.");
}
}

效果就是如果手动赋值那里不注释掉,一圈跑下来大概是3s左右,但是把手动赋值去掉,让他自加溢出恢复最小值然后开始第二轮循环的话需要的时间就涨到了7s左右……但我思来想去不明白为什么时间会增加了一倍之久,于是后来为了了解执行路径,我加了一个输出,发现不管是自加自动恢复最小值还是手动赋值最小值都是从最小加到最大,而且由于输出需要时间,加了输出命令后,两者执行时间就都一样了,都是19s左右。到底问题出在哪了?请高手赐教!
integer 自加

------解决方案--------------------
加到最大值之后在自加,已经超出了int基本数据类型的最大范围,于是作了默认的类型提升(type promotion),中间结果做为long类型存放,返回结果时目标数据类型int不能够容纳下结果,于是根据Java的基础类型的变窄转换(Narrowing primitive conversion)规则,把结果宽于int类型宽度的部分全部丢弃,也就是只取结果的低32位,于是。。。。。。多出来的时间。。。。。你懂的~~~