1. 程式人生 > >JAVA自動拆裝箱

JAVA自動拆裝箱

1.自動拆裝箱是什麼?(是什麼)

自動裝箱就是Java自動將原始型別值轉換成對應的物件,比如將int的變數轉換成Integer物件,這個過程叫做裝箱,反之將Integer物件轉換成int型別值,這個過程叫做拆箱。因為這裡的裝箱和拆箱是自動進行的非人為轉換,所以就稱作為自動裝箱和拆箱.

java中有8中基本的資料型別,這八種基本的資料型別都有對應的封裝型別,下面是對應關係:

int——Integer
float——Float
double——Double
byte——Byte
long——Long
char——Character
boolean——Boolean
short——Short

2.java為什麼要引入自動裝箱和拆箱的功能?(為什麼)

舉個例子:主要是用於java集合中,List<Inteter> list=new ArrayList<Integer>();
list集合如果要放整數的話,只能放物件,不能放基本型別,因此需要將整數自動裝箱成物件,基本資料型別,如int,float,double,boolean,char,byte,不具備物件的特徵,不能呼叫方法。

實現原理:javac編譯器的語法.

3.又是怎麼實現的呢?(怎麼做)

(舉個例子)

裝箱:將基本型別轉換成包裝類物件

int i=10;
Integer x=new Integer(i);手動裝箱
Integer y=10;自動裝箱

拆箱:將包裝類物件轉換成基本型別的值

Integer j=new Integer(8);
int m=j.intValue();//手動拆箱
int n=j;//自動拆箱

看下面這段程式碼,為什麼?(T為true,F為false)

public class Main {
    public static void main(String[] args) {
         
        Integer a = 10;
        Integer b = 20;
        Integer c = 30;
        Integer d = 30;
        Integer e = 320;
        Integer f = 320;
        Long g = 30L;
        Long h = 20L;
         
        System.out.println(c==d);//T
        System.out.println(e==f);//F
        System.out.println(c==(a+b));//T
        System.out.println(c.equals(a+b));//T
        System.out.println(g==(a+b));//
        System.out.println(g.equals(a+b));
        System.out.println(g.equals(a+h));
    }
}

解釋:

因為自動裝箱,自動呼叫valueOf方法.

 public static Integer valueOf(int i) {//Integer包裝類的
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

Integer的valueOf方法中一句判斷,i >= -128 && i <= IntegerCache.high
如果數值在-128和127之間,就直接呼叫IntegerCache類,返回快取中的資料,自然是同一個物件.
否則新建一個Integer物件.

(Double包裝類的valueOf方法直接新建一個新物件)

(Boolean包裝類valueOf方法,返回 (b ? TRUE : FALSE),)其他的請自行檢視,判斷.

同時自動拆箱時,編譯器通過呼叫類似intValue(),doubleValue()這類的方法將物件轉換成原始型別值,其實就是自動裝箱的相反操作.

4.注意點(弊端):

容易生成無用物件,因為自動裝箱會隱式地建立物件,像前面提到的那樣,如果在一個迴圈體中,會建立無用的中間物件,這樣會增加GC壓力,拉低程式的效能。所以在寫迴圈時一定要注意程式碼,避免引入不必要的自動裝箱操作.