10.int和Integer的區別(重點)

cxrlover發表於2020-12-08

是不是覺得這個很簡單?那不如先來一個題目吧!

根據下面程式碼寫出輸出結果:

Integer i1 = new Integer(12);
Integer i2 = new Integer(12);
System.out.println(i1 == i2);

Integer i3 = 126;
Integer i4 = 126;
int i5 = 126;
System.out.println(i3 == i4);
System.out.println(i3 == i5);

Integer i6 = 128;
Integer i7 = 128;
int i8 = 128;
System.out.println(i6 == i7);
System.out.println(i6 == i8);

可以執行一下看一下結果,和你想的是不是一樣!

原因分析:

Integer i1 = new Integer(12);
Integer i2 = new Integer(12);
System.out.println(i1 == i2);

相信這個不難,應該答對了!

一但看到 new 這個關鍵字,是一定會在記憶體中開闢一塊新記憶體用來存放物件的。所以這個題根本都不用看值是不是一樣,直接就是 false。

來看第二部分

Integer i3 = 126;
Integer i4 = 126;
int i5 = 126;
System.out.println(i3 == i4);
System.out.println(i3 == i5);

這裡先說 i3 == i5 的比較,因為一個是 int 一個是 Integer 型別,所以這時候會對 Integer 型別的變數進行拆箱操作,然後在跟 int 型別的變數進行比較。所以這時候其實是兩個int型別的比較,結果是 true。

i3 == i4 和下邊那部分一塊分析。

第三部分

Integer i6 = 128;
Integer i7 = 128;
int i8 = 128;
System.out.println(i6 == i7);
System.out.println(i6 == i8);

i6 == i8 的原因在上邊第二部分分析過了,所以這裡不再說明。

主要說明 i6 == i7 和 上邊的 i3 == i4 的原因。

在對Integer型別的變數通過字面量賦值的時候(Integer i = 1 ,這種形式就是字面量賦值),在底層會呼叫 Integer.valueOf 方法。而Integer類的內部維護了一個 Integer型別的 -128 ~ 127 的陣列,如果賦值的在這個範圍內,會直接使用這裡邊的物件。不在這個範圍的數字,則會通過new 的方式新建一個物件。

看到這裡應該知道為什麼會產生這樣的結果了吧!

最後放一下Integer類中的 緩衝陣列原始碼:

這裡是valueOf方法

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

這裡看到,如果 i 滿足條件 i >= IntegerCache.low && i <= IntegerCache.high 就會返回
IntegerCache.cache[i + (-IntegerCache.low)],返回 cache陣列中的一個元素。
下邊揭祕關鍵部分。 這裡只拉取部分程式碼。

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            // ...
            high = h;

到這裡就可以看出來範圍是 -128 ~ 127 之間了,在這個範圍會返回陣列中已有的元素,不在這個範圍就新建一個。

相關文章