Java基本類型的自動裝箱與自動拆箱
文章目錄
一、簡介
java是面入對象編程的語言,所有的都表示爲對象。那麼對於基本類型,java提供了對應的包裝類。相應的就有自動裝箱與自動拆箱操作。
二、自動裝箱
2.1 定義
自動裝箱是指基本類型轉爲對應的包裝類,如int轉Integer,double轉爲Double等。
2.2 轉換方法
轉換的方式是通過Integer.valueOf()、Double.valueOf()等方式(注意此時涉及到對應包裝類的靜態緩存問題)。
2.3 轉換時機
當對包裝類型的變量進行賦值或傳值時,會進行自動裝箱操作。特別注意,當對包裝類變量進行多次運算(如循環)且值不在靜態緩存內(-128到127內)時,這時會多次new相應的對象,會製造很多無用的對象實例。
2.4 在方法中傳遞包裝類對象
此時傳遞的雖是對象引用,但由於經過運算修改後,方法內的變量(或者說是線程內的變量)是新建(new)的包裝類,因此,方法外面的包裝類變量,並不會隨着方法內變量值的改變而改變。
三、自動拆箱
3.1 定義
自動拆箱是指將包裝類轉爲基本類型,如Integer轉爲int、Double轉爲double等
3.2 轉換方法
轉換的方式是通過Integer.intValue()、Double.doubleValue();
3.3 轉換時機
當進行算術運算或給基本類型賦值時,會進行拆箱操作。
四、代碼實例
public class BaseTypeBoxingMain {
public static void main(String[] args) {
autoBoxing1(); //自動裝箱例1 基本裝箱操作
autoBoxing2(); //自動裝箱例2 會新建多個無用的對象
unBoxing(); //自動拆箱示例
System.out.println("====================包裝類對象方法間傳遞====================");
Integer i= 1;
System.out.println("source i:"+i);
changeValue(i); //方法調用,試圖修改值,結果是不成功的
System.out.println("after invoke changeValue , i:"+i);
}
//自動裝箱例1
static void autoBoxing1() {
System.out.println("======================自動裝箱例1===========================");
Integer i1 = 1; //Integer.valueOf() 緩存取
Integer i2 = 1; //Integer.valueOf() 緩存取
System.out.println(i1 == i2);
Integer i5 = 222; //Integer.valueOf() new
Integer i6 = 222; //Integer.valueOf() new
System.out.println(i5 == i6);
Double d1 = 1d; //Double.valueOf() new
Double d2 = 1d; //Double.valueOf() new
System.out.println(d1 == d2);
Double d3 = 222d; //Double.valueOf() new
Double d4 = 222d; //Double.valueOf() new
System.out.println(d3 == d4);
}
//自動裝箱例2
static void autoBoxing2() {
System.out.println("======================自動裝箱例2===========================");
Integer cnt = 1;
for (int i = 200; i < 203; i++) { //此時會創建3個新的Integer實例
cnt += 1;
System.out.println(System.identityHashCode(cnt)); //hashcode不一樣,也就是存儲地址不一樣,也就說不是同一個對象
}
}
//自動拆箱
static void unBoxing() {
System.out.println("======================自動拆箱示例===========================");
Integer i1 = 1;
int i2 = i1; //基本類型賦值 i2=i1.intValue()
System.out.println(i2);
int i3 = i1 + 1; // 基本類型進行運算 i3=i1.intValue()+1
System.out.println(i3);
}
static void changeValue(Integer val) {
val = 2;
System.out.println("in changeValue ,i:"+val);
}
}
運行結果:
======================自動裝箱例1===========================
true
false
false
false
======================自動裝箱例2===========================
1625635731
1580066828
491044090
======================自動拆箱示例===========================
1
2
====================包裝類對象方法間傳遞====================
source i:1
in changeValue ,i:2
after invoke changeValue , i:1