讓人疑惑的Java程式碼 - Java那些事兒

清淺池塘發表於2017-09-25

我們先看一段程式碼,很簡單對不對

讓人疑惑的Java程式碼 - Java那些事兒

執行一下:

讓人疑惑的Java程式碼 - Java那些事兒

和大多數人心裡想的不一樣吧,好多人還在糾結,到底是全是true還是全是false呀。

然而一個是true,一個是false,這是為什麼呢?

有的人根本不去思考,直接開啟百度搜尋去查詢答案(一個個都是百度首席軟體工程師)

根據Java編譯機制,.java檔案在編譯以後會生成.class檔案給JVM載入執行,於是找到.class檔案,反編譯看了一下,發現編譯器在編譯我們的程式碼時,很調皮(聰明的)的在我們宣告的變數加上了valueOf方法 ,程式碼變成了如下:

讓人疑惑的Java程式碼 - Java那些事兒

看一下valueOf方法的實現

讓人疑惑的Java程式碼 - Java那些事兒

我們發現,Integer的作者在寫這個類時,為了避免重複建立物件,對Integer值做了快取,如果這個值在快取範圍內,直接返回快取好的物件,否則new一個新的物件返回,那究竟這個快取到底快取了哪些內容呢?看一下IntegerCache這個類:

讓人疑惑的Java程式碼 - Java那些事兒

這是一個內部靜態類,該類只能在Integer這個類的內部訪問,這個類在初始化的時候,會去載入JVM的配置,如果有值,就用配置的值初始化快取陣列,否則就快取-128到127之間的值。

再來看看我們之前的程式碼:

讓人疑惑的Java程式碼 - Java那些事兒

結論:我們在比較兩個Integer物件的值時,無論是怎麼宣告的,都一定要使用equals去比較,不能用==,在Java中沒有過載操作符這一說,特別是從其它語言轉到Java的童鞋們要注意。equals我在其它文章裡已經做了詳細解說,傳送門:說說Java裡的equals(上) - 知乎專欄

讓人疑惑的Java程式碼 - Java那些事兒

思考以下程式碼的執行結果:

讓人疑惑的Java程式碼 - Java那些事兒


如果喜歡本系列文章,請點贊或順手分享,您的支援是我繼續下去的動力,您也可以在評論區留言想了解的內容,有機會本專欄會做講解,最後別忘了關注一下我。

上一篇:寫在專欄前 - Java那些事兒

下一篇:Java字串那些兒 - Java那些事兒

轉載無限歡迎,但請註明「作者」和「原文地址」。轉載請在文中保留此段,感謝您對作者版權的尊重。如需商業轉載或刊登,請聯絡作者獲得授權。


相關文章