1. 程式人生 > >Java基礎-----JDK1.5的新特性自動裝箱和拆箱

Java基礎-----JDK1.5的新特性自動裝箱和拆箱

JDK1.5的新特性

1、自動裝箱:把基本型別轉換為包裝類型別。
2、自動拆箱:把包裝類型別轉換為基本型別。

注意:在使用,Integer x = null;程式碼就會出現NullPointerException。

package StringBufferPackage;

public class Test4 {
	public static void main() {
		int x = 100;
		Integer i1 = new Integer(x);//將基本資料型別包裝成物件,裝箱。
		int y = i1.intValue();//將物件轉換為基本資料型別,拆箱。
		
		Integer i2 = 100;//自動裝箱,把基本資料型別轉換為物件。
		int z = i2 + 200;//自動拆箱,把物件轉換為基本資料型別。
		
		Integer i3 = null;
		int a = i3 + 100;//底層i3呼叫intValue,但是i3是null,null呼叫方法就會出現空指標異常
		System.out.println(a);
	}
}

Integer的面試題
package StringBufferPackage;

public class Test5 {
	public static void main(String[] args) {
	Integer i1 = new Integer(19);
		Integer i2 = new Integer(19);
		System.out.println(i1 == i2);//false
		System.out.println(i1.equals(i2));//true
		System.out.println("---------------------------");
		
		Integer i1 = new Integer(197);
		Integer i2 = new Integer(197);
		System.out.println(i1 == i2);//false
		System.out.println(i1.equals(i2));//true
		System.out.println("---------------------------");
		
		Integer i3 = 127;
		Integer i4 = 127;
		System.out.println(i3 == i4);//true
		System.out.println(i3.equals(i4));//true
		System.out.println("------------------------");
		
		Integer i5 = 128;
		Integer i6 = 128;
		System.out.println(i5 == i6);//false
		System.out.println(i5.equals(i6));//true
		
	}
}

-128到127是byte的取值範圍,如果在這個取值範圍內,自動裝箱就不會新建立物件,而是從常量池中獲取,如果超過了byte的取值範圍就會再新建立物件。

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

對於同過Integer i = 2這樣的方式,底層為什麼會呼叫valueOf方法還不太清楚,期望可以得到高人指點。