1. 程式人生 > >java 之裝箱與拆箱的研究總結

java 之裝箱與拆箱的研究總結

今天看java JDK7的新特新語法糖的時候突然有提到裝箱與拆箱,就特地加深一下:

所謂裝箱:就是在程式碼編譯期將基本型別轉化為包裝型別,使其基本有型別具有物件特徵

所謂拆箱:與裝箱過程相反,就是把包裝型別轉為基本型別 

自動裝箱/拆箱 就是程式碼在編譯根據程式碼的語法,決定是否裝箱或者拆箱!

一:先說說equals()和== 號的區別吧!

Integer,short的自動裝箱:

Integer a = -129; //超出-128
Integer b = -129;
Integer c=1;
Integer d=1;
System.out.println(c==d);
System.out.println(a==b);

輸出結果為:false,true。也就是說:

1:自動裝箱針對於值-128~127之間,他們被裝箱後會在記憶體中被重用!如果超過了這個區間那麼就不會被重用,也就相當於每次新建一個Integer 的物件!

再來說說equals()和== 號的區別吧:

Integer a = -129;
		Integer b = -129;
		System.out.println(a.equals(b)); 
		System.out.println(a==b); //地址未被重用
輸出結果為:true false

說明:

equals() 比較的是兩個物件的值(內容)是否相同。

"==" 比較的是兩個物件的引用(記憶體地址)是否相同,也用來比較兩個基本資料型別的變數值是否相等。

String、的裝箱與拆箱
    String str1 = "abc";
           String str2 = "abc";
           System.out.println(str2==str1);  //輸出為 true 
           System.out.println(str2.equals(str1));  //輸出為 true 
             
           String str3 = new String("abc");
           String str4 = new String("abc"); 
           System.out.println(str3==str4);  //輸出為 false 
           System.out.println(str3.equals(str4));  //輸出為 true
可以看出來 str1 str2引用的是同一物件,str3 str4卻是倆個不同的物件

注意:Integer i=3; 事實上呼叫的Integer.valueOf(int i);   裝箱是Integer.valueOf(int i),那麼拆箱是:i.intValue()!

需要注意的是:

包裝型別的“==”運算在沒有遇到算數運算子的情況下不會自動拆箱,而其包裝型別的equals()方法不會處理資料型別轉換,所以:

Integer a = 1;  
Integer b = 1;  
Long c = 1L;  
System.out.println(a == b);  
System.out.println(c.equals(a));  
這樣的程式碼是有誤區的, 根本不會實現拆裝箱的操作!這樣的程式碼應該儘量避免自動拆箱與裝箱。