1. 程式人生 > >Java裝箱拆箱之Integer和int的區別

Java裝箱拆箱之Integer和int的區別

面向物件的Java,為了程式設計的方便為每一個基本資料型別都引入了對應的包裝型別,提供了拆箱和裝箱的語法糖,而int的包裝類就是Integer。

一、基本區別

Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null。

二、其他區別

public static void main(String[] args) {
		int s=1;
		Integer aInteger =1;
		Integer bInteger =2;
		Integer cInteger =3;
		Integer dInteger =3;
		Integer eInteger =127;
		Integer fInteger =127;
		Integer integer = new Integer(2);
		Integer kinteger = new Integer(2);
		Integer m=128;
		Integer h=128;
		Long gLong = 3L;
		System.out.println(s==aInteger);//true
		System.out.println(s==integer);//false
		System.out.println(cInteger==dInteger);//true
		System.out.println(eInteger==fInteger);//true
		System.out.println(m==h);//false		
		System.out.println(integer==kinteger);//false
		System.out.println(cInteger==(aInteger+bInteger));//true
		System.out.println(cInteger.equals(aInteger+bInteger));//true
		System.out.println(gLong==(aInteger+bInteger));//true
		System.out.println(gLong.equals(aInteger+bInteger));//false
	}

(1)上面第一行和第的輸出結果說明int和Integer(無論new否)比,都為true,因為會把Integer自動拆箱為int再去比。

(2)第四行和第五行同樣的型別,一個是127和127的比較,一個是128和128的比較,一個返回true,而一個卻返回false,這是什麼現象?其實兩個都是非new出來的Integer,如果數在-128到127之間,則是true,否則為false。因為java在編譯Integer i2 = 128的時候,被翻譯成:Integer i2 = Integer.valueOf(128);而valueOf()函式會對-128到127之間的數進行快取。

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

(3)第六行結果返回false,是因為兩個都是new出來的存放在堆中,比較的是記憶體地址,而記憶體地址不一樣返回false。

(4)第七、八行結果都返回true,而九、十行的結果一個返回true,一個返回false,是因為包裝類重寫了equals方法,而非new的Integer常量則在常量池(在方法區),型別一樣的可以直接比較值

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }