Integer Test
Long Test
注意 == 比較兩個對象,是比較堆上對象的內存地址是否指向同一對象,equals比較的是字面值。
Integer源碼
說明
緩存的最小值low為-128(不可變),緩存的最大值high默認為127,high可以通過啟動應用程序時加上 -XX:AutoBoxCacheMax=<size> 選項來指定high的值,當第一次使用Integer類型數據時,會加載IntegerCache這個靜態內部類對象,然后在執行類的靜態初始化,這個初始化會獲取JVM的屬性設置。
當指定的size小于127,則還是使用默認設置,當大于127則根據指定的值設置high。
這個IntegerCache內部含有一個名字叫cache的Integer類型數組,長度為high-low +1,初始化過程會[low,high]范圍的int類型的數據都包裝成Integer類型,放入cache數組當中。
當獲取Integer數值時,在[low,hiht]范圍內的則直接返回cache數組中對應的Integer對象,超出范圍則創建一個Integer類型的數據。
Long源碼
需要注意的是雖然Long類型也緩存[-128,127]的數據,但是返范圍是固定的不可調整的, -XX:AutoBoxCacheMax=<size> 參數設置對Long類型的緩存也不起作用。
其他包裝類型的緩存情況
Character [0,127]
GC對緩存的影響
緩存數組cache永遠不會被GC,除非Integer類對象被卸載。
VM參數設置Integer的緩存high
-XX:AutoBoxCacheMax=<size> 參數設置對JVM client模式無效,只對sever模式有效。
總結
當系統當中的數字在一個較小的范圍內變化,則可以通過緩存對象的方式,提前創建好對象,可有效減少頻繁創建Integer對象的性能開銷。