本文將介紹Java中Integer的緩存相關(guān)知識。這是在Java 5中引入的一個有助于節(jié)省內(nèi)存、提高性能的功能。首先看一個使用Integer的示例代碼团搞,從中學(xué)習(xí)其緩存行為。接著我們將為什么這么實現(xiàn)以及他到底是如何實現(xiàn)的多艇。你能猜出下面的Java程序的輸出結(jié)果嗎莺丑。如果你的結(jié)果和真正結(jié)果不一樣,那么你就要好好看看本文了墩蔓。
上述代碼執(zhí)行結(jié)果如上圖梢莽。
在Integer的操作上,jdk引入了緩存的實現(xiàn)來提高性能節(jié)省內(nèi)存奸披,復(fù)用了-128到127區(qū)間的Integer昏名。
對于Integer i = 0這種賦值語句,Java的編譯器把基本數(shù)據(jù)類型自動轉(zhuǎn)換成封裝類對象的過程叫做自動裝箱阵面,相當(dāng)于使用valueOf方法轻局。
我們看一下valueOf方法源碼
可以看到如果i在-128-127(默認(rèn)127,可以通過XX:AutoBoxCacheMax=size參數(shù)修改)數(shù)值區(qū)間內(nèi)样刷,valueOf會直接返回緩存結(jié)果仑扑。
IntegerCache是Integer底下的一個靜態(tài)內(nèi)部類,IntegerCache內(nèi)部維護(hù)了一個Integer數(shù)據(jù)置鼻,與兩個int屬性(低位和高位)镇饮。
在static代碼塊中,會循環(huán)實例化cache數(shù)組中的Integer對象箕母,完成緩存的初始化工作储藐。
為什么選擇-128到127這個范圍呢俱济?因為這個范圍的數(shù)字是最被廣泛使用的。
下面貼一段?Java Integer Cache?文檔的譯文(譯文來自Hollis):