JAVA知識撿漏——拆箱和裝箱

1.什麼是裝箱和拆箱

自動根據數值創建對應的Integer對象,這就是裝箱。
自動將包裝器類型轉換爲基本數據類型,這就是拆箱。

2.裝箱和拆箱是如何實現的

java1.5開始的自動裝箱拆箱機制其實是編譯時自動完成替換的,裝箱階段替換爲valueOf方法,拆箱階段自動替換xxxValue方法。
對於Integer、Short、Byte、Character、Long類型的valueOf方法,參數如果在-128~127之間的值會直接返回內部緩衝池中已經存在對象的引用,參數是其他範圍的值則返回新建對象。
對於Double、Float類型與Integer類型類似,一樣會調用Double、Float的ValueOf方法,但是不管傳入的參數值是多少都會new一個對象來表達該數值,因爲在某個範圍內的整型數值的個數是有限的,而浮點數卻不是。

3.java拆箱裝箱實例
        Integer i1=100;
		Integer i2=100;
		Integer i3=200;
		Integer i4=200;
		
		System.out.println(i1==i2); //true
		System.out.println(i1.equals(i2)); //true
		System.out.println(i3==i4);  //false
		System.out.println(i3.equals(i4));  //true
		
		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(d1.equals(d2));  //true
		System.out.println(d3==d4);  //false
		System.out.println(d3.equals(d4));  //true

        Boolean b1=false;
		Boolean b2=false;
		Boolean b3=true;
		Boolean b4=true;
		System.out.println(b1==b2);  //true
		System.out.println(b3==b4);  //true

對於兩邊都是包裝類型的比較**==比較的是引用,equals比較的是值。**

        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 m=444;
		int n=444;
		System.out.println(m==n);  //true
		System.out.println(m.equals(n));  //true

對於兩邊有一邊是表達式(包含算式運算)則==比較的是數值(自動觸發拆箱過程),對於包裝類型equals不會進行類型轉換。

4.java拆箱裝箱實例2
        Integer l1=new Integer(127);
		Integer l2=new Integer(127);
		
		System.out.println(l1==l2);  //false
		System.out.println(l1.equals(l2));  //true

注意:new Integer()這種創建對象的方法不是自動裝箱,沒有用到內部緩衝區。因此i1==i2是false;

5.java拆箱裝箱實例3
        Long l3=128L;
		Long l4=128L;
		
		System.out.println(l3==l4);  //false
		System.out.println(l3==128L);  //true
		
		Long l5=127L;
		Long l6=127L;
		
		System.out.println(l5==l6);   //true
		System.out.println(l6==127L);  //true
6.談談Integer i = new Integer(xxx)和Integer i =xxx;這兩種方式的區別

1)第一種方式不會觸發自動裝箱的過程;而第二種方式會觸發。
  2)在執行效率和資源佔用上的區別。第二種方式的執行效率和資源佔用在一般性情況下要優於第一種情況(注意這並不是絕對的)。

7.java語句Integeri=1;i+=1;做了哪些事情?

首先 Integer i = 1; 做了自動裝箱(使用 Integer.valueOf() 方法將 int 裝箱爲 Integer 類型),接着 i += 1; 先將 Integer 類型的 i 自動拆箱成 int(使用Integer.intValue() 方法將 Integer 拆箱爲 int),完成加法運行之後的 i 再裝箱成 Integer 類型。

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