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

咱們先看一段代碼,很簡單對不對java

執行一下:數組

和大多數人內心想的不同吧,好多人還在糾結,究竟是全是true仍是全是false呀。緩存

然而一個是true,一個是false,這是爲何呢?post

有的人根本不去思考,直接打開百度搜索去查找答案(一個個都是百度首席軟件工程師)cdn

根據Java編譯機制,.java文件在編譯之後會生成.class文件給JVM加載執行,因而找到.class文件,反編譯看了一下,發現編譯器在編譯咱們的代碼時,很調皮(聰明的)的在咱們聲明的變量加上了valueOf方法 ,代碼變成了以下:對象

看一下valueOf方法的實現blog

咱們發現,Integer的做者在寫這個類時,爲了不重複建立對象,對Integer值作了緩存,若是這個值在緩存範圍內,直接返回緩存好的對象,不然new一個新的對象返回,那究竟這個緩存到底緩存了哪些內容呢?看一下IntegerCache這個類:字符串

這是一個內部靜態類,該類只能在Integer這個類的內部訪問,這個類在初始化的時候,會去加載JVM的配置,若是有值,就用配置的值初始化緩存數組,不然就緩存-128到127之間的值。get

再來看看咱們以前的代碼:編譯器

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

思考如下代碼的執行結果:


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

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

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

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

相關文章
相關標籤/搜索