8種基本型別:char、byte、short、int、long、float、double、boolean。
對應各自的封裝型別。
以 integer 類為例,其他型別原理類似。
先看比較物件的 equals 方法的重寫:
public
boolean
equals(object obj)
return
false;
}
所以型別如果不一樣,那麼直接返回 false。
equals 方法重寫後,hashcode 也進行了重寫:
以 integer 為例,hashcode 返回結果就是基本型別的 int 值。
@override
public
inthashcode()
public
static
inthashcode(int value)
下面開始看自動裝箱和拆箱的原理。
直接賦值時,都會自動呼叫 valueof 方法。
integer 類中定義了 integercache,這個類中有 integer 陣列,該陣列已經快取了 -128~127 之間的所有 integer 物件。
private
static
class
integercache catch( numberformatexception nfe)
}high = h;
cache = new integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new integer(j++);
// range [-128, 127] must be interned (jls7 5.1.7)
assert integercache.high >= 127;
}private
integercache() {}
}
所以在 valueof 方法中,將 int 裝箱時,判斷如果在這個範圍中,直接返回物件,而不需要 new 這個新物件。
public
static integer valueof(int i)
然後看下邊的示例:
public
static
void
main(string args)
直接賦值時,都會自動呼叫 valueof 方法,而 12 是在 -128~127 之間的,所以快取中有其實例,兩個引用同乙個物件。而 200 超出了這個範圍,兩個物件都是 new 的新物件,兩個物件不是同乙個。
自動拆箱有個很典型的用法就是在進行運算的時候,因為物件時不能直接進行運算的,而是要轉化為基本資料型別後才能進行加減乘除。
看下邊的示例:
public
static
void
main(string args)
注意
character 類:快取 0~127 的字元,其它需要新建立。
byte,short,integer,long 類:快取 -128~127 的物件,其它值需要重新建立。
float,double 類:沒有快取,直接建立。
boolean 類:快取 true 和 false 兩個物件,直接賦值即可。
封裝類和基本型別
封裝類和基本型別的區別 1 封裝類可以呼叫屬性和方法,而基本型別不能。2 封裝類是引用型別。例如乙個集合list,只能往裡面新增物件,也就是object,封裝類就可以作為物件新增,而基本型別不行 基本型別只能按值傳遞,而每個基本型別對應的封裝類是按引用傳遞的 可以通過封裝類實現把string型別轉換...
Java 8種基本型別包裝類和String的常量池
通過如下 輸出可以看出常量池數值範圍為 128 127。integer i1 129 integer i2 129 system.out.println i1 i2 t i1 i2 i1 128 i2 128 system.out.println i1 i2 t i1 i2 i1 127 i2 12...
4 13 基本型別的類封裝
4.13 基本型別的類封裝 基本資料型別的封裝類 基本資料型別 double float byte int short long char boolean 基本資料型別的封裝 double float byte integer short long character 構造方法建立物件 double...