1. 程式人生 > >關於int和integer(史上最全面,最認真的總結,新鮮出爐,我也標題黨一次把)

關於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 }