我們先看一段代碼庐舟,很簡單對不對
執(zhí)行一下:
和大多數(shù)人心里想的不一樣吧猪半,好多人還在糾結降铸,到底是全是true還是全是false呀在旱。
然而一個是true晃择,一個是false谒养,這是為什么呢?
有的人根本不去思考乏奥,直接打開百度搜索去查找答案(一個個都是百度首席軟件工程師)
根據(jù)Java編譯機制谅畅,.java文件在編譯以后會生成.class文件給JVM加載執(zhí)行登渣,于是找到.class文件,反編譯看了一下毡泻,發(fā)現(xiàn)編譯器在編譯我們的代碼時胜茧,很調皮(聰明的)的在我們聲明的變量加上了valueOf方法 ,代碼變成了如下:
看一下valueOf方法的實現(xiàn)
我們發(fā)現(xiàn)仇味,Integer的作者在寫這個類時呻顽,為了避免重復創(chuàng)建對象雹顺,對Integer值做了緩存,如果這個值在緩存范圍內芬位,直接返回緩存好的對象无拗,否則new一個新的對象返回,那究竟這個緩存到底緩存了哪些內容呢昧碉?看一下IntegerCache這個類:
這是一個內部靜態(tài)類,該類只能在Integer這個類的內部訪問揽惹,這個類在初始化的時候被饿,會去加載JVM的配置,如果有值搪搏,就用配置的值初始化緩存數(shù)組狭握,否則就緩存-128到127之間的值。
再來看看我們之前的代碼:
結論:我們在比較兩個Integer對象的值時疯溺,無論是怎么聲明的论颅,都一定要使用equals去比較,不能用==囱嫩,在Java中沒有重載操作符這一說恃疯,特別是從其它語言轉到Java的童鞋們要注意。
轉載出自:https://zhuanlan.zhihu.com/p/27562748