大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
来自:https://blog.csdn.net/qq_33611068/article/details/77369050
有这样一道题:
编程测试,遍历 0 到 int所能表示最大的正数,将消耗的时间打印。
下面是我的代码:
1 int temp = 0;2 Date dt1 = newDate();3 long begintime =dt1.getTime();4 for(int i=0;i<=Integer.MAX_VALUE;i++){5 temp =i;6 }7 Date dt2 = newDate();8 long endtime =dt2.getTime();9 System.out.println(endtime – begintime);
这段代码是会陷入死循环的,就死在了for里面。
刚开始的时候我还以为是这个数字太大了,一时半会儿遍历不到,我就将这个数字打印了一下:结果是2147483647。然后我就将代码中的Integer.MAX_VALUE逐步换成1000000,5000000,……,逐渐逼近这个数,等到换到21亿的时候,我发现还是可以快速执行完毕的。
然后我就怀疑是Integer.MAX__VALUE属性出现了某种问题,就将其换成了2147483647,还是死循环,看来怀疑错了,问题还是出现在这个数字身上。
这时候我再一次的检查了一次for循环,重点检查了终止条件,果然是这里出了问题,看我的for循环:
for(int i=0;i<=Integer.MAX_VALUE;i++){
temp=i;
}
只有当i比int最大值大的时候才能结束循环,可问题是……
i本身就是int类型的,它怎么可能比int的最大值还大!!!
for循环运行到 i = Integer.MAX_VALUE ,即 i = 2147483647,i再加1,就变成了-2147483648
(这个地方明白源码,反码,补码的同学已经懂了吧,不明白的等我详细的整理一个专题或者留言询问……请关注我)
这个负数与int最大值来比较,结果显然,要比最大值小,循环继续执行,重复这个过程,for循环永远都不会执行完毕。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195882.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...