java自動裝箱和拆箱


基本數據類型,如int,float,double,boolean,char,byte,不具備對象的特征,不能調用方法。
裝箱:將基本類型轉換成包裝類對象
int i=10;
Integer x=new Integer(i);手動裝箱
Integer y=10;自動裝箱
 
拆箱:將包裝類對象轉換成基本類型的值
Integer j=new Integer(8);
int m=j.intValue();//手動拆箱
int n=j;//自動拆箱
 
 
java為什么要引入自動裝箱和拆箱的功能?又是怎么實現的呢?
主要是用於java集合中,List<Inteter> list=new ArrayList<Integer>();
list集合如果要放整數的話,只能放對象,不能放基本類型,因此需要將整數自動裝箱成對象。
實現原理:javac編譯器的語法糖
 
public class Main {
    public static void main(String[] args) {
         
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
         
        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }
}
//結果為:true false
 
在通過Integer.valueOf()方法創建Integer對象的時候,如果數值在[-128,127]之間,便返回指向IntegerCache.cache中已經存在的對象的引用(位於堆對象池中);否則創建一個新的Integer對象(創建在java堆中)。上面的代碼中i1和i2的數值為100,因此會直接從cache中取已經存在的對象,所以i1和i2指向的是同一個對象,而i3和i4則是分別指向不同的對象。
 
public class Main {
    public static void main(String[] args) {
         
        Double i1 = 100.0;
        Double i2 = 100.0;
        Double i3 = 200.0;
        Double i4 = 200.0;
         
        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }
}
//結果為:false false
為什么Double類的valueOf方法會采用與Integer類的valueOf方法不同的實現呢?很簡單:在某個范圍內的整型數值的個數是有限的,而浮點數卻不是。
 
public class Main {
    public static void main(String[] args) {
         
        Boolean i1 = false;
        Boolean i2 = false;
        Boolean i3 = true;
        Boolean i4 = true;
         
        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }
}
//結果為:true true
至於為什么是這個結果,同樣地,看了Boolean類的源碼也會一目了然。下面是Boolean的valueOf方法的具體實現:
 
 
public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }
 
 
 
public class H {
 
public static void main(String[] args) {
 
 
        Integer m=10;
        int n=10;
        System.out.println(m==n);
}
}
//結果為:true

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM