Java自動裝箱-拆箱機制究竟是什麼
自動裝箱和拆箱從Java 1.5開始引入,目的是將原始型別值轉自動地轉換成對應的物件。
什麼是自動裝箱和拆箱
自動裝箱就是Java自動將原始型別值轉換成對應的物件,比如將int的變數轉換成Integer物件,這個過程叫做裝箱,反之將Integer物件轉換成int型別值,這個過程叫做拆箱。
原始型別byte,short,char,int,long,float,double和boolean對應的封裝類為Byte,Short,Character,Integer,Long,Float,Double,Boolean。
何時發生自動裝箱和拆箱
比如我們有一個方法,接受一個物件型別的引數,如果我們傳遞一個原始型別值,那麼Java會自動講這個原始型別值轉換成與之對應的物件。
ArrayList<Integer> intList = new ArrayList<Integer>(); intList.add(1); //自動裝箱 - primitive to object intList.add(2); //自動裝箱 ThreadLocal<Integer> intLocal = new ThreadLocal<Integer>(); intLocal.set(4); //自動裝箱 int number = intList.get(0); // 拆箱 int local = intLocal.get(); // 拆箱
Java 1.5以前我們需要手動地進行轉換才行,而現在所有的轉換都是由編譯器來完成
//Java 1.5以前 Integer iObject = Integer.valueOf(3); Int iPrimitive = iObject.intValue() //Java 1.5之後 Integer iObject = 3; //自動裝箱 - primitive to wrapper conversion int iPrimitive = iObject; //拆箱 - object to primitive conversion
自動裝箱的弊端
在一個迴圈中進行自動裝箱操作,會建立多餘的物件,影響程式的效能。
Integer sum = 0; for(int i=1000; i<5000; i++){ sum+=i; }
sum = sum + i,但是+這個操作符不適用於Integer物件,首先sum進行自動拆箱操作,進行數值相加操作,最後發生自動裝箱操作轉換成Integer物件。其內部變化如下
int result = sum.intValue() + i; Integer sum = new Integer(result);
上面的迴圈中會建立將近4000個無用的Integer物件,浪費了效能。
生成無用物件增加GC壓力,在寫迴圈時一定要注意程式碼,避免引入不必要的自動裝箱操作。
熱度: 7