1. 簡介
大家對基本數據類型都非常熟悉,例如 int、float、double、boolean、char 等。基本數據類型是不具備對象的特性,比如基本類型不能調用方法、功能簡單。。。,為了讓基本數據類型也具備對象的特性, Java 為每個基本數據類型都提供了一個包裝類,這樣我們就可以像操作對象那樣來操作基本數據類型。
對象包裝類是不變的,即一旦構造了包裝類,就不允許更改包裝在其中的值。同時,對象包裝類還是final,因此不能定義它們的子類。
假設想定義一個整型數組列表,而尖括號中的類型參數不允許是基本類型的,也就是說,不允許寫成ArrayList
ArrayList list = new ArrayList();
備注:
ArrayList
進行如下操作:
list.add(3);
將自動轉換為:
list.add(Integer.valueOf(3));
這種變換就是自動裝箱。
相反的,當將一個Integer對象賦予一個int值時,將會自動拆箱:
int n = list.get(i)
將自動轉換為:
int n = list.get(i).intValue();
備注:
裝箱與拆箱是編譯器認可的,而不是虛擬機。編譯器在生成類的字節碼時,插入必要的方法調用。虛擬機只是執行這些字節碼。
使用數值對象包裝類有一個好處:
可以將某些基本方法放置在包裝類中。
int x = Integer.parseInt(s);
2. 分類
裝箱:把基本類型轉換成包裝類,使其具有對象的性質,又可分為手動裝箱和自動裝箱
package com.qunar.test;
public class HelloWorld {
public static void main(String[] args) {
// 定義一個int基本類型值
int num = 14;
// 手動裝箱
Integer x = new Integer(num);
// 自動裝箱
Integer y = num;
System.out.println("x->"+x+" y->"+y);
}
}
拆箱:和裝箱相反,把包裝類對象轉換成基本類型的值,又可分為手動拆箱和自動拆箱
package com.qunar.test;
public class HelloWorld {
public static void main(String[] args) {
// 定義一個Integer包裝類
Integer integer = new Integer(8);
// 手動拆箱
int x = integer.intValue();
// 自動拆箱
int y = integer;
System.out.println("x->"+x+" y->"+y);
}
}
3. 分析
自動裝箱的弊端:
自動裝箱有一個問題,那就是在一個循環中進行自動裝箱操作的情況,如下面的例子就會創建多余的對象,影響程序的性能:
Integer sum = 0;
for(int i=1000; i<5000; i++){
sum+=i;
}
上面的代碼sum+=i可以看成sum = sum + i,但是+這個操作符不適用於Integer對象,首先sum進行自動拆箱操作,進行數值相加操作,最後發生自動裝箱操作轉換成Integer對象。其內部變化如下:
sum = sum.intValue() + i;
Integer sum = new Integer(result);
因此在我們編程時,需要注意到這一點,正確地聲明變量類型,避免因為自動裝箱引起的性能問題。