關於int和integer(史上最全面,最認真的總結,新鮮出爐,我也標題黨一次把)
首先int和integer有是區別,是個人都知道integer是int的封裝類,int是java 的一個基本資料型別,是一個關鍵字。
然後可能還會有人說int預設是0,integer物件預設是null,這有一個前提,那是作為類的成員,如果你在一個方法中出現
int a;
system.out.print(a);編譯不通過,a沒有初始化。同樣的integer也是這樣,一定要注意這個前提。
接下里就是最重要的內容了
首先說明一下自動裝箱和自動拆箱。
自動裝箱:
integer a=7;
在執行這句話的時候其實執行的真正內容是integer a=integer.valueof(7),下面是這個方法
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
很明顯,這裡有一個快取,對於-128到127之間的數會有一個快取,那麼這個時候integer將不會建立新的物件,直接獲取現有在快取中的物件,如果不再這個範圍內那麼將會new一個integer物件出來。總的來說自動裝箱的意思就是integer a=7這句話不是顯示的new一個物件,但是還是要建立為一個物件。
自動拆箱
將一個integre物件轉化成int型。例如:
integer a=10;
int b=10;
system.out.print(a==b);//執行a==b的時候,a會有一個自動拆箱的過程,執行a.intvalue()返回一個int值再和b比較,然後就轉化成基本資料型別的比較,此時就是值的比較,那麼肯定最後的結果就是true。
注意的一點是==兩邊是基本資料型別,那麼就是值的比較,如果是物件型別,那麼就是比較物件的地址,這個是之前文章裡有寫道的。
上面提到的integer的快取,就是在裝箱的時候才會經過,如果直接new一個integer物件,不經過那個快取的。
其他的包裝類的快取情況如下:
包裝器:
- Boolean:(全部快取)
- Byte:(全部快取)
- Character(<= 127快取)
- Short(-128 — 127快取)
- Long(-128 — 127快取)
- Float(沒有快取)
- Doulbe(沒有快取)
那麼上面說這麼多,就明白了很多見下面例子
public static void main(String[] args) { int i = 128; Integer i2 = 128; Integer i3 = new Integer(128); //Integer會自動拆箱為int,所以為true System.out.println(i == i2); System.out.println(i == i3); System.out.println("**************"); Integer i5 = 127;//java在編譯的時候,被翻譯成-> Integer i5 = Integer.valueOf(127); Integer i6 = 127; System.out.println(i5 == i6);//true,127在快取區間,i5,i6是同一個物件 /*Integer i5 = 128; Integer i6 = 128; System.out.println(i5 == i6);//false 128不再快取區間,128就是兩個物件 */ Integer ii5 = new Integer(127); System.out.println(i5 == ii5); //false ii5是直接new一個物件,即使在那個快取區間裡,但是這裡直接new,不會經過那個快取。
Integer a = new Integer(12);
Integer b = new Integer(12);
System.out.println(a == b);//false 上面說了,直接new物件,那就是直接建立兩個不同的物件。
Integer i7 = new Integer(128); Integer i8 = new Integer(123); System.out.println(i7 == i8); //false }