第一個輸出是true, 第二個輸出是false羡鸥。
這道題在筆試題中遇過好多次曾沈。解釋一般是100在-128到127之間,所以是同一個對象烙博,二者用==判斷瑟蜈,也是相等的。為何是同一個對象呢渣窜?
根據(jù)Java編譯機制铺根,.java文件在編譯以后會生成.class文件給JVM加載執(zhí)行,于是找到.class文件乔宿,反編譯看了一下位迂,發(fā)現(xiàn)編譯器在編譯我們的代碼時,很調(diào)皮(聰明的)的在我們聲明的變量加上了valueOf方法 予颤,代碼變成了如下:
也就是加上了valueOf方法,這個valueOf方法做了什么事呢冬阳?
判斷該int值是否在緩存數(shù)組里蛤虐,如果在,直接取數(shù)組中的對象返回(這也就是i3==i4的原因)肝陪。
Integer的作者在寫這個類時驳庭,為了避免重復(fù)創(chuàng)建對象,對Integer值做了緩存氯窍,如果這個值在緩存范圍內(nèi)饲常,直接返回緩存好的對象,否則new一個新的對象返回狼讨。
轉(zhuǎn)自知乎專欄 https://zhuanlan.zhihu.com/p/27562748