參考
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,比較兩物件的內容,而不是比較兩物件的地址。
沒有留言:
張貼留言