Java包裝模擬較和包裝類底層快取陣列

2021-08-21 18:33:30 字數 2453 閱讀 8886

關於包裝類的比較問題,我們先看以下**:

integer i1 = 100;

integer i2 = 100;

integer i3 = 200;

integer i4 = 200;

system.out.println(i1 == i2); // true

system.out.println(i3 == i4); // false

double d1 = 100.0;

double d2 = 100.0;

double d3 = 200.0;

double d4 = 200.0;

system.out.println(d1 == d2); //false

system.out.println(d3 == d4); //false

為什麼 i1和 i2 比較為true,i3和i4比較為false呢?

這是因為直接將乙個 基本型別的數字賦值給包裝類發生了自動裝箱,會隱式呼叫integer的靜態方法valueof()方法,下面我們看一下valueof()方法的原始碼

public static integer valueof(int i)
通過原始碼發現,在new integer()之前會先判斷傳入的值是否在integercache的cache陣列範圍裡,如果在的話就直接返回引用。不在的話,建立乙個新的integer物件。

下面我們看一下integercache原始碼:

private static class integercache  catch( numberformatexception nfe) 

}high = h;

cache = new integer[(high - low) + 1];

int j = low;

for(int k = 0; k < cache.length; k++)

cache[k] = new integer(j++);

// range [-128, 127] must be interned (jls7 5.1.7)

assert integercache.high >= 127;

}private integercache() {}

}

通過原始碼我們發現integercache會預設把-128到127儲存到cache陣列裡面。因此,你如果多次傳入 100 ,它返回的物件都是同乙個物件。

這時我們回到上面的題目,就可以知道原因了,因為使用 == 比較的是位址,當傳入兩個100,在integercache的cache陣列範圍內,返回同一物件,所以比較結果為true,當傳入的為200 時,不在陣列範圍內,所以每次都會建立乙個新的物件,所以比較結果為false。

那為什麼double包裝模擬較結果都是false呢?

雖然double 於與 integer 類相似都會呼叫valueof()方法,但是在指定範圍內浮點型資料個數不確定,而整型的個數是確定的,所以double 是不可以快取的,它每次都會返回乙個新的物件。

注意:integer,short,byte,character,long 的valueof方法實現類似,而double和float 比較特殊,每次返回新包裝物件。

如果是使用 new 建立的,不會快取,每次都會返回乙個新物件

下面我們繼續看包裝類的比較

integer a = 1;

integer b = 2;

integer c = 3;

integer d = 3;

integer e = 321;

integer f = 321;

long g = 3l;

long h = 2l;

system.out.println(c == d); //true

system.out.println(e == f); //false

system.out.println(c == (a + b)); //true

system.out.println(c.equals(a + b));//true

system.out.println(g == (a + b)); //true

system.out.println(g.equals(a + b));//false

system.out.println(g.equals(a + h));//true

integer a2 = 444;

int c3 = 444;

system.out.println(a2 == c3); // true

system.out.println(a2.equals(c3));//true

通過上述**我們可以得出以下結論:

Java 包裝模擬較時帶來的問題

例1 integer a 1 integer b 2 integer c 3 integer d 3 integer e 321 integer f 321 long g 3l system.out.println c d 1 system.out.println e f 2 system.out....

Java基礎 包裝類

包裝類 為什麼要用包裝類,因為八大基本資料型別有的時候需要轉換成物件才能使用,比如在容器中。基本資料型別對應的包裝類 byte byte short short int integer long long float float double double char charactor boolea...

Java包裝類 筆記17

基本資料型別 原生類 包裝類 byte byte short short int integer long long float float double double char character boolean boolean 例子 取long型的最大值 system.out.println l...