Java基本類型的自動裝箱與自動拆箱

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