Java 基本數據類型的包裝類型的大部分都用到了緩存機制來提升性能。
Byte
,Short
,Integer
,Long
這 4 種包裝類默認創建了數值 [-128,127] 的相應類型的緩存數據,Character
創建了數值在 [0,127] 范圍的緩存數據,Boolean
直接返回 True
or False
。
果超出對應范圍仍然會去創建新的對象,緩存的范圍區間的大小只是在性能和資源之間的權衡。
兩種浮點數類型的包裝類?Float
,Double
?并沒有實現緩存機制。
public static void main( String[] args ){Integer i1 = 128;Integer i2 = 128;System.out.println(i1 == i2);// 輸出 falseInteger i3 = 33;Integer i4 = 33;System.out.println(i3 == i4);// 輸出 trueFloat i11 = 333f;Float i22 = 333f;System.out.println(i11 == i22);// 輸出 falseDouble i5 = 1.2;Double i6 = 1.2;System.out.println(i6 == i5);// 輸出 falseInteger i7 = 40;Integer i8 = new Integer(40);System.out.println(i7==i8);//輸出false,因為i7直接用的緩存,i8則是創建的對象,存在堆}
裝箱其實就是調用了 包裝類的valueOf()
方法,拆箱其實就是調用了?xxxValue()
方法。?
Integer i = 10 //等價于 Integer i = Integer.valueOf(10)
int n = i //等價于 int n = i.intValue();