Java中關於int與Integer的區別

java中的int和Integer雖然都表示整數,可它們實際上是不同的,如果不理解其中區別有時候會出現莫名其妙的問題。

我們來看下面幾種情況

int  a = 1;
int b =1;
System.out.println(a==b)

比較結果爲true,這符合正常邏輯,1==1結果自然爲true

Integer a= new Integer(1);
Integer b= new Integer(1);
System.out.println(a==b)

比較結果卻爲false,因爲a和b是兩個不同的對象,雖然值都爲1,可引用的地址卻不同,爲對象應用==運算符, 比較的是應用地址,爲值類型應用==運算符,比較的纔是真正的值,這裏是比較對象,結果就爲false了。

Integera = 127;
Integerb = 127;
System.out.println(a ==b);

比較結果爲true,這令人疑惑,上面不是說Integer類型是比較引用的, 那麼這裏是兩個不同的對象,以爲着有不同的引用,結果爲何爲true。 這是因爲直接爲Integer類型賦值值類型時設計到一個自動裝箱操作,編譯器會調用Integer.valueOf方法來實現這個效果,實際上編譯起執行的代碼大概是像下面這樣子的

Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
System.out.println(a ==b);

我們再看valueOf方法的代碼

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

當參數值在-128和127之間時,返回的是IntegerCache.cache中的緩存值,因此結果才爲true,因爲valueOf返回的是同一個對象。而當參數值不在範圍內時,valueOf方法會通過newInteger創建一個新的對像, 所以

Integer a = 128;
Integer b = 128;
System.out.println(a ==b);

以上代碼執行的結果就爲false了,因爲每次調用valueOf方法,方法都回調用new Integer創建一個全新對象,而不是複用緩存中的對象。

int a = 128;
Integer b = 128;
System.out.println(a ==b);

結果爲true, 因爲當把Integer類型與int比較時, 編譯器會味Integer類型執行拆箱操作:將Integer轉換爲int, 那麼時間上最終==運算符的兩側都會是int類型,對於值的比較只要值是相等的,那麼結果即爲true。

綜上所述,在不考慮性能的情況下,使用int而不適用Integer能提高程序的正確性,因爲對int的數值操作邏輯更加簡單安全。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章