你真的理解 Integer 的緩存問題嗎?
作者 | 明明如月小角落
責編 | 屠敏
出品 | CSDN 博客
背景
下面給出一個例子,問輸出的結果是多少:
很多新手可能非常猶豫,有一些經驗的同學可以回答出"標準"答案。
問原因則隨口就說」Integer緩存了-128到127之間的整數對象「,為什麼會緩存?還有其他答案?可能就不知道了。
what??? 難道這不是標準答案?還想咋地?
分析
運行
想知道答案很容易,直接運行,結果是 true ,false。
源碼法
直接看源碼, 我們知道聲明整數時,會通過 java.lang.Integer#valueOf(int) 構造(不信可以斷點)。
通過源碼和注釋可以看到 如果是-128到127之間的整數,則會使用整數緩存對象,否則就new一個整形對象。
因此第一個是true,第二個是false。
反彙編
前面講到了,用到了 再問一個問題 為什麼調用了 java.lang.Integer#valueOf(int) ?
我們直接反彙編:javap -c IntTest
很明顯四個Integer對象的構造使用了java/lang/Integer.valueOf函數。
那麼除了上面的回答還有哪些更完善的回答呢?
我們繼續看 java.lang.Integer.IntegerCache的源碼
可以看到可以通過設置虛擬機參數:XX:AutoBoxCacheMax=或 -Djava.lang.Integer.IntegerCache.high=
來設置緩存範圍的最大值(包含)。
因此如果將最大值設置為150或者以上。則程序的答案就是 true, true。
另外緩存是 《Java語言規範》的要求,具體可以去語言規範里看。
這裡提供手冊的下載地址:https://docs.oracle.com/javase/specs/index.html
總結
我們看一些文章的時候,不要止步於文章給出的標準答案,否則總是「背」文章,印象不深刻。
最好自己能夠動手DEMO一下,能過親自去源碼里看一看,能夠有自己的思考,才能學得更多。
研究Java相關問題除了多看源碼外,還可以多反彙編,不要懼怕,一回生兩回熟,慢慢就會樂此不疲。
總之希望本文能夠給大家一些啟發,養成讀源碼,反彙編等好的學習方法,更快進階。
聲明:本文為 CSDN 博主「明明如月小角落」的原創文章,版權歸作者所有,如需轉載請聯繫作者。
【END】
熱 文推 薦
※中國晶元人才大軍在哪裡?
※千億智慧照明市場背後,BLEMESH免開發方案成主流
TAG:CSDN |