搜尋此網誌

2013年9月26日 星期四

【Java】Primitive VS. Wrapper Class

看了很多書,都沒有很清楚說明為何要這兩個class的差別,而且又是從c語言跳到Java,覺得Wrapper Class的出現簡直莫名其妙。很久以前之前還被嗆難道不知道宣告int要先new出來。後來看了不少資料,得到以下結論:

參考

 Wrapper Class的出現,是因為Java裡面提供的許多API只能針對物件(例如,Collection),無法適用於基本型別(即int, long, char, boolean等)。為了使這些基本型別也可以適用,所以Java創造了與這些基本型別相對應的wrapper class
 Primitive  <-->Wrapper Class
--------------------------------
boolean <-> Boolean
byte <-> Byte
char <-> Character
short <->Short
int <-> Integer
long <-> Long
float <-> Float
double <-> Double


Primitive在宣告時,不需new,即可以在記憶體產生。例:int i=10;
Wrapper在宣告時,需new即可以在記憶體產生。例:Integer wInt= new Integer(10); 
int ii = wInt.intValue; //ii=10 


而Autoboxing的機制,就是自動把primitive轉成wrapper;相反地,Unboxing的機制就是自動把
wrapper轉成primitive。

 Autoboxing機制的目的:是要減少實體化的物件數,因此透過建立一個pool來儲存這些因auboxing產生出的物件,但這也造成另一問題:這些備產生出的物件不會輕易隨便殺掉。如果沒有限制建立這些物件,記憶體會快就用光,避免這些memory overflow的問題,Java限制每個wrapper class的pool範圍。若超過這個範圍,就會以一般建立物件的方式new出來。例:Integer i = new Integer(321);
Boolean:  (全部暫存)
Byte:         (全部暫存)
Character:  [0, 127] 暫存
Short :          [-128, 127] 暫存
Long:           [-128, 127] 暫存
Float:        (沒有暫存)
Double:   (沒有暫存)


因此,下例

int getNumber() {
        //do something
        return 128;
}

Integer value1 = 128;  //Autoboxing
Integer value2 =
getNumber();  //Autobixing
if (value1 == value2) {
        System.out.println(“A”);
}
else {
        System.out.println(“B”);
}

當value1和value2都個別autoboxing成物件,所以會分別指向pool中不同的記憶體位置。
在做判斷"=",因為指向不同記憶體位置,所以回傳結果,答案會是B。 

 所以在牽涉到兩物件比較時,需要用equals或compareTo的method,比較兩物件的內容,而不是比較兩物件的地址。

沒有留言: