JAVA自動拆裝箱
1.自動拆裝箱是什麼?(是什麼)
自動裝箱就是Java自動將原始型別值轉換成對應的物件,比如將int的變數轉換成Integer物件,這個過程叫做裝箱,反之將Integer物件轉換成int型別值,這個過程叫做拆箱。因為這裡的裝箱和拆箱是自動進行的非人為轉換,所以就稱作為自動裝箱和拆箱.
java中有8中基本的資料型別,這八種基本的資料型別都有對應的封裝型別,下面是對應關係:
int——Integer
float——Float
double——Double
byte——Byte
long——Long
char——Character
boolean——Boolean
short——Short
2.java為什麼要引入自動裝箱和拆箱的功能?(為什麼)
list集合如果要放整數的話,只能放物件,不能放基本型別,因此需要將整數自動裝箱成物件,基本資料型別,如int,float,double,boolean,char,byte,不具備物件的特徵,不能呼叫方法。
實現原理:javac編譯器的語法.
3.又是怎麼實現的呢?(怎麼做)
(舉個例子)
裝箱:將基本型別轉換成包裝類物件
int i=10;Integer x=new Integer(i);手動裝箱
Integer y=10;自動裝箱
拆箱:將包裝類物件轉換成基本型別的值
Integer j=new Integer(8);
int m=j.intValue();//手動拆箱
int n=j;//自動拆箱
看下面這段程式碼,為什麼?(T為true,F為false)
public class Main {
public static void main(String[] args) {
Integer a = 10;
Integer b = 20;
Integer c = 30;
Integer d = 30;
Integer e = 320;
Integer f = 320;
Long g = 30L;
Long h = 20L;
System.out.println(c==d);//T
System.out.println(e==f);//F
System.out.println(c==(a+b));//T
System.out.println(c.equals(a+b));//T
System.out.println(g==(a+b));//
System.out.println(g.equals(a+b));
System.out.println(g.equals(a+h));
}
}
解釋:
因為自動裝箱,自動呼叫valueOf方法.
public static Integer valueOf(int i) {//Integer包裝類的
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Integer的valueOf方法中一句判斷,i >= -128 && i <= IntegerCache.high
如果數值在-128和127之間,就直接呼叫IntegerCache類,返回快取中的資料,自然是同一個物件.
否則新建一個Integer物件.
(Double包裝類的valueOf方法直接新建一個新物件)
(Boolean包裝類valueOf方法,返回 (b ? TRUE : FALSE),)其他的請自行檢視,判斷.
同時自動拆箱時,編譯器通過呼叫類似intValue(),doubleValue()這類的方法將物件轉換成原始型別值,其實就是自動裝箱的相反操作.
4.注意點(弊端):
容易生成無用物件,因為自動裝箱會隱式地建立物件,像前面提到的那樣,如果在一個迴圈體中,會建立無用的中間物件,這樣會增加GC壓力,拉低程式的效能。所以在寫迴圈時一定要注意程式碼,避免引入不必要的自動裝箱操作.