支持原文:http://tryenough.com/java-autobox
自動裝箱和拆箱從Java 1.5開始引入,目的是將原始類型值轉自動地轉換成對應的對象。
什麼是自動裝箱和拆箱
自動裝箱就是Java自動將原始類型值轉換成對應的對象,比如將int的變量轉換成Integer對象,這個過程叫做裝箱,反之將Integer對象轉換成int類型值,這個過程叫做拆箱。
原始類型byte,short,char,int,long,float,double和boolean對應的封裝類爲Byte,Short,Character,Integer,Long,Float,Double,Boolean。
支持原文:http://tryenough.com/java-autobox
何時發生自動裝箱和拆箱
比如我們有一個方法,接受一個對象類型的參數,如果我們傳遞一個原始類型值,那麼Java會自動講這個原始類型值轉換成與之對應的對象。
支持原文:http://tryenough.com/java-autobox
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對象。其內部變化如下
支持原文:http://tryenough.com/java-autobox
int result = sum.intValue() + i;
Integer sum = new Integer(result);
支持原文:http://tryenough.com/java-autobox
上面的循環中會創建將近4000個無用的Integer對象,浪費了性能。
生成無用對象增加GC壓力,在寫循環時一定要注意代碼,避免引入不必要的自動裝箱操作。