您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關int和Integer緩存的實現是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
int相信我們都很熟悉吧,Java中的原始數據類型,同為原始數據類型的還有long、short、float、double、char、byte、boolean。原始數據類型不是對象。
Integer是int對應的包裝類,其中有一個private final int value;來存儲數據,并且還提供了一些基本操作,例如sum、max、int和字符串的轉換等方法。從value聲明為private final可以得知它也是一個不可變類型!
在Java5中引入了自動裝箱和自動拆箱功能,也就是Java可以根據上下文自動將int轉為Integer或Integer轉為int。自動裝箱、拆箱其實算一種語法糖(語法糖就是對現有語法的一個封裝,主要是為了方便程序員的開發,提高開發效率)。
在編譯階段發生,由javac來幫我們自動裝箱、拆箱。具體是調用Integer.valueOf方法來進行裝箱,調用Integer.intValue方法來進行拆箱。我們來反編譯下看看是不是這樣,例如以下代碼
反編譯結果,確實是這樣!
我們再來說說這個valueOf方法,構建Integer對象的傳統方式是直接調用構造器new一個對象,但是根據實踐發現大部分的數據操作都集中在值比較小的范圍,所以Java5中又引入了靜態工廠方法valueOf,調用它時會利用IntegerCache,也就是一個緩存,能帶來明顯的性能改進。默認的緩存值是-128到127。
什么意思呢?先看一下源碼
如果沒有修改默認緩存值(-128到127)的話,我們執行Integer i = 一個值(注意不是直接new Integer,直接new是不會利用緩存的),這個值如果大于等于-128,小于等于127,是不會new一個新的Integer對象而是去IntegerCache去找到這個緩存對象的引用直接返回。這樣我們常用的一些值就能直接用緩存了!減少了消耗!
如果明確知道常用的整型的值更大一些那也是可以修改默認緩存值的。
通過設置JVM -XX:AutoBoxCacheMax=<size> 來修改緩存的最大值,最小值改不了。
再來看看IntegerCache都干了啥
很簡單吧,就是弄了個Integer數組,在靜態代碼塊內去讀看看我們有沒有設-XX:AutoBoxCacheMax=<size>,沒得話直接就拿默認的緩存值初始化cache數組,并且將一個個Integer放入數組內,如果有設置integerCacheHighPropValue 就修改下最大的緩存值,然后操作。
還有一點要注意:避免無意中的裝箱和拆箱,特別是在性能敏感的場合,因為創建大量的對象和大量的整數,無論是從內存角度還是處理速度上開銷不是一個數量級的。所以在性能敏感的場合盡量使用原始數據類型。
看完上述內容,你們對int和Integer緩存的實現是怎樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。