當前位置:
首頁 > 科技 > 你真的理解 Integer 的緩存問題嗎?

你真的理解 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】

熱 文推 薦

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

中國晶元人才大軍在哪裡?
千億智慧照明市場背後,BLEMESH免開發方案成主流

TAG:CSDN |