12.17 Java中為什麼100==100返回true,1000==1000返回false?

最近寫代碼發現一個非常奇怪但是有趣的事情。我們運行下面的代碼:


Java中為什麼100==100返回true,1000==1000返回false?

以你的常識,在不參考任何書籍情況下,猜猜結果會是什麼吧??

基本知識:我們知道,如果兩個引用指向同一個對象,用==比較它們,結果應該是相等的。如果兩個引用指向不同的對象,用==比較它們,結果應該是不相等的,即使它們的內容相同。

很明顯對吧,a和b,c和d指向的明顯不是同一個對象嘛,那會輸出什麼呢? false,false???

要不看看答案?

Java中為什麼100==100返回true,1000==1000返回false?

我擦!怎麼會有一個true,難道是我電腦中毒了嗎?還是說我以前學的知識都是騙人的?

真是一臉懵逼!但是不搞懂它怎麼行呢,為此我翻閱了大量資料,終於知道了答案!

我先去看 Integer.java類,結果發現有一個內部私有類 : IntegerCache.java,它緩存了從-128到127之間的所有的整數對象。

結果事情就成了,所有的-128至127的小整數,都是在內部緩存的。當你進行以下聲明的時候:

Java中為什麼100==100返回true,1000==1000返回false?

實際上,它在內部做的是:

Java中為什麼100==100返回true,1000==1000返回false?

現在,如果我們去看valueOf()方法,我們可以看到:

Java中為什麼100==100返回true,1000==1000返回false?

如果值的範圍在-128到127之間,它就從高速緩存返回實例。

所以,我們寫:

Java中為什麼100==100返回true,1000==1000返回false?

的時候,c和d指向了同一個對象,於是結果輸出true。

現在你可能會問,為什麼這裡需要緩存?

合乎邏輯的理由是,在此範圍內的“小”整數使用率比大整數要高,因此,使用相同的底層對象是有價值的,可以減少潛在的內存佔用。

終於知道怎麼回事了吧!以後見到這樣的問題,一定要注意哦!否則代碼量一大,你可能打死都找不到這種bug,絕對會煩死你。

Java中為什麼100==100返回true,1000==1000返回false?


分享到:


相關文章: