Java自動裝箱-拆箱機制究竟是什麼

支持原文: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壓力,在寫循環時一定要注意代碼,避免引入不必要的自動裝箱操作。

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