在java中,有幾個基本數據類型,在java的一切皆對象的思想下,他們好像顯得比較特殊,比如我們直接一個int i=1;好像這個1並不是一個對象,其實這個是java採用了一種自動裝箱和拆箱來實現,首先java的編譯器對int i =1加上了Integer.valueOf(),使得實際編譯前的這行代碼 ...
在java中,有幾個基本數據類型,在java的一切皆對象的思想下,他們好像顯得比較特殊,比如我們直接一個int i=1;好像這個1並不是一個對象,其實這個是java採用了一種自動裝箱和拆箱來實現,首先java的編譯器對int i =1加上了Integer.valueOf(),使得實際編譯前的這行代碼為int i=Integer.valueOf(1),然後我們再來通過jdk的源碼分析valueOf這個方法,
可以看出,在IntegerCache.low 和 IntegerCache.high之外的,會直接new一個integer的對象,然後我們再來看下if裡面的這部分,
integerCache是Integer里的一個私有的對象,他負責儲存一些integer對象,我們平時對於1到100這之間的數字的使用頻率是很高的,如果每次都去新建對象的話,是會多耗費一些資源的,此時,在integer類的載入過程中,將這些較小的對象初始話出來,然後在遇到這些對象時直接取出來使用,就能較好的提高效率,這個過程,正是由integerCache來實現的,在上面這段代碼中integerCache獲得了他初始化的數組的最大和最小值,最小值預設為-128,最大值有jvm參數java.lang.Integer.IntegerCache.high獲得,改值預設為127,如需改變,可通過jvm參數-XX:AutoBoxCacheMax=<size>來設置,在未設置時,下麵代碼運行結果如如註釋
public static void main(String[] args) { System.out.println(sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"));//127 Integer a = 127; Integer b = 127; System.out.println(a==b);//true Integer a1 = 128; Integer b1 = 128; System.out.println(a1==b1);//false }
而我們設置在jvm啟動參數加上了XX:AutoBoxCacheMax=200後,運行結果如下
public static void main(String[] args) { System.out.println(sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"));//127 Integer a = 127; Integer b = 127; System.out.println(a==b);//true Integer a1 = 128; Integer b1 = 128; System.out.println(a1==b1);//true }
同樣,我們查看Byte,Short,Long等等包裝類,都可以看出,在他們的類中維護了一個-128到127的本類的對象,並且其他的包裝類的大小時不可配置的。