一、裝箱機制緩存
基礎類型引用到其包裝類型,這樣就能夠調用其各類方法。code
例如,咱們聲明:對象
Integer a = 1;編譯器
其在編譯過程當中會自動解釋成:源碼
Integer a = Integer.valueOf(1);編譯
這就是自動裝箱的過程。class
二、拆箱機制基礎
與裝箱相反,將引用類型簡化爲基礎類型。語法
例如咱們在進行比較時:引用
Integer a = 1;
System.out.println(a == 1); // 2
2在編譯中會將Integer類型的a自動拆箱,解釋爲:
int a = new Integer(1);
而後再去與1進行對比。
注意:自動裝箱和拆箱是由編譯器來完成的,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動做。
三、緩存機制
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2);
System.out.println(i3 == i4);
最後的運行結果 分別是 true 和 false!
既然 Integer聲明時會被自動裝箱爲Integer.valueOf(int i)的方法,咱們能夠看看Integer源碼。
發現當 i 的值在-128到127之間時會直接返回內部緩存池中已經存在對象的引用,而這個範圍就叫作自動裝箱池,而當參數是其範圍以外時則會新建對象並返回對象,這樣就能解釋以上的結果了。
一樣的,能夠看看其它的封裝類會是什麼狀況?
對應的自動裝箱池大小以下:
Byte,Short,Long對應的是-128~127
Character對應的是0~127
Float和Double沒有自動裝箱池