Java自動裝箱和拆箱,包裝類緩存機制和JVM調節

關於Java自動裝箱和拆箱

基本數據(Primitive)類型的自動裝箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0開始提供的功能java

自動裝箱,我的感受也就是爲了所謂的java泛型,泛型就是一種糖,裝箱是一種糖也就更好解釋了。而且二者都是編譯器提供的,都存在於編譯期(固然編譯器作的越多,JVM就能夠解釋的越快),我想經過反編譯,能夠輕鬆的發現。算法

自動裝箱:把基本類型用它們對應的引用類型包裝起來,使它們具備對象的特質 Integer a=3(Integer源碼,註釋的信息量很大啊( ̄ ̄)")數組

自動拆箱:將Integer及Double這樣的引用類型的對象從新簡化爲基本類型的數據 int i = new Integer(2)緩存

基本類型防迷惑

基本類型無論多大,==都返回true,由於基本類型不會比較地址,更不存在equals優化

包裝類所提供的緩存機制

每一個整形的包裝類,包括Long、Integer、Short、Byte、Character,都提供了緩存機制(一種優化手段),可是Float、Double沒有,也就沒有==比較的有趣現象了。spa

調整JVM參數-XX:AutoBoxCacheMax=250,最大緩存值能夠達到-128—250 ,只能調整上限,這和Integer緩存算法實現有關,固然這個參數只對Integer有效,Long...沒法調節,經過源碼能夠清楚的看到這一點。對象

關於包裝類的equals編譯器

關於==,說-128—127存在所謂的常量池由於緩存就是一個靜態數組,能夠認爲存在常量池),不如說是整形包裝類停供的緩存機制,由於當-128—127是從緩存(xxxCache數組)中取。源碼

每個整形包裝類裏面都有一個,私有靜態內部類XXXCache,裏面含有對應類型的固定長度(其實經過JVM參數能夠調節)的final cache數組 。見下面源碼(注意註釋):it

再看一下Long的(很簡單):

再看一下valueOf的源碼,就會發現若是值在-128—127,會直接從cache(就是一個數組,在XXXCache私有靜態內部類中)中取。

相關文章
相關標籤/搜索