天天看點

JDK新特性之自動拆裝箱

自動拆箱裝箱

Integer ii = 100;
ii += 200;
System.out.println("ii:"+ii);
           

等價于

Integer ii = Integer.valueof(100);//自動裝箱
ii = Integer.valueOf(ii.intValue() + 200);//自動拆箱再自動裝箱
System.out.println(new StringBuilder("ii:").append(ii).toString())
           

Integer的資料直接指派

首先要明确一點的是 Integer 類裡是重寫了equals() 方法,是以 == 比較的位址值,equals() 比較的是内容

Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2);	//false
System.out.println(i1.equals(i2)); //true

Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
System.out.println(i3 == i4);	//false
System.out.println(i3.equals(i4)); //true

Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6);	//false
System.out.println(i5.equals(i6)); //true

Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8);	//true
System.out.println(i7.equals(i8)); //true

以上我們了解自動裝箱操作,直接指派其實就是:
Integer ii = Integer.valueof(127)
           

再看 valueOf() 方法的源碼

其中low  -128 
	high 127
public static Integer valueOf(int i) {
	assert IntegerCache.heigh >= 127;
	if (i >= IntegerCache.low && i <= IntegerCache.heigh)
		return IntegerCache.cache[i+(-InteferCache.low)];
	return new Integer(i);
}
           

通過源碼就發現,針對 i 在-128到127之間做了一個資料緩沖區,如果資料在 -128 到 127 之間,會直接從緩沖池裡擷取資料,反之,建立新的空間。