來自:https://blog.csdn.net/qq_33611068/article/details/77369050
有這樣一道題:
編程測試,遍歷 0 到 int所能表示最大的正數,將消耗的時間打印。
下面是我的代碼:
1 int temp = 0; 2 Date dt1 = new Date(); 3 long begintime = dt1.getTime(); 4 for(int i=0;i<=Integer.MAX_VALUE;i++){ 5 temp = i; 6 } 7 Date dt2 = new Date(); 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循環永遠都不會執行完畢。