最近寫代碼發現一個非常奇怪但是有趣的事情。我們運行下面的代碼:
以你的常識,在不參考任何書籍情況下,猜猜結果會是什麼吧??
基本知識:我們知道,如果兩個引用指向同一個對象,用==比較它們,結果應該是相等的。如果兩個引用指向不同的對象,用==比較它們,結果應該是不相等的,即使它們的內容相同。
很明顯對吧,a和b,c和d指向的明顯不是同一個對象嘛,那會輸出什麼呢? false,false???
要不看看答案?
我擦!怎麼會有一個true,難道是我電腦中毒了嗎?還是說我以前學的知識都是騙人的?
真是一臉懵逼!但是不搞懂它怎麼行呢,為此我翻閱了大量資料,終於知道了答案!
我先去看 Integer.java類,結果發現有一個內部私有類 : IntegerCache.java,它緩存了從-128到127之間的所有的整數對象。
結果事情就成了,所有的-128至127的小整數,都是在內部緩存的。當你進行以下聲明的時候:
實際上,它在內部做的是:
現在,如果我們去看valueOf()方法,我們可以看到:
如果值的範圍在-128到127之間,它就從高速緩存返回實例。
所以,我們寫:
的時候,c和d指向了同一個對象,於是結果輸出true。
現在你可能會問,為什麼這裡需要緩存?
合乎邏輯的理由是,在此範圍內的“小”整數使用率比大整數要高,因此,使用相同的底層對象是有價值的,可以減少潛在的內存佔用。
終於知道怎麼回事了吧!以後見到這樣的問題,一定要注意哦!否則代碼量一大,你可能打死都找不到這種bug,絕對會煩死你。
閱讀更多 我是IT程序猿 的文章