1. 程式人生 > 其它 >基本資料型別的封裝類

基本資料型別的封裝類

技術標籤:JAVA

建立方法

構造方法

以Integer型別為例,提供兩種構造方法,一種是以對應的基本資料型別為引數的構造方法,一種是以字串為引數的構造方法。
1、Integer (int number);
2、Integer (String str);

直接使用基本資料型別賦值

這裡有兩個概念:裝箱和拆箱。

Integer in1 = 1;

在這種直接賦值的情況下,會自動將基本資料型別裝箱成對應的封裝類物件,然後賦值給封裝類物件。

int i0 = 10;
Integer in0 = 10;
System.out.println(i0 == in0);

思考:一個基本資料型別和一個封裝類的物件之間使用==比較,是比較數值還是地址?

上面程式碼的輸出結果是true,既然是true,那麼比較的就不是地址了,事實上這裡是對in0這個Integer封裝類進行了一次拆箱操作,將in0拆箱轉換成int型別來和i0比較。

易錯點

在學習String的時候我們遇到了字串常量池,其實在基本資料型別封裝類中,我們也會碰到類似的東西。廢話不多說,上程式碼

int i0 = 10;
Integer in1 = 10;
Integer in2 = 10;
Integer in3 = new Integer(10);
Integer in4 = new Integer(10);
Integer in5 = 199;
Integer in6 = 199;
System.
out.println(i0 == in1); System.out.println(i0 == in3); System.out.println(in1 == in2); System.out.println(in2 == in3); System.out.println(in3 == in4); System.out.println(in4 == in5); System.out.println(in5 == in6);

輸出結果:在這裡插入圖片描述
是不是很意外?我想大家最大的疑惑就是最後的in5 == in6的結果是false吧。
依次來解釋一下吧,

i0和in1的比較

結果是true,這是上面講過的in1拆箱稱為int型別然後和i0比較,所以是數值上的比較。

在這裡插入圖片描述

i0和in3的比較

結果true,這也是拆箱,說明拆箱操作不論哪種建立方式都是有效的。
在這裡插入圖片描述

in1和in2 的比較

結果是true,如果看過String中的字串常量池,這裡應該會很好理解,與之對應的,Integer也有其常量池(會在in5和in6的比較結果出詳細講解),因此in1和in2的地址都是其常量池中的地址,所以在比較地址的時候他們的結果是true
在這裡插入圖片描述

in2和in3的比較

結果false,這裡就什麼可以多說的了,只要記住new是新開闢的地址,引用資料型別==比較的是地址,就可以做出來了。
在這裡插入圖片描述

in3和in4

結果false,大家都是new新開闢的地址,自然是不一樣的了。在這裡插入圖片描述

in4和in5

結果是false,原因同上。
在這裡插入圖片描述

in5和in6

結果是false,Why?不是應該返回常量池中的地址嗎,為什麼會不相等?
在這裡插入圖片描述
Integer中有個靜態內部類IntegerCache,裡面有個cache[ ],這就是靜態常量池,它的大小是1個位元組[-128, 127],裡面存放著已經建立好的對應-128~127的Integer物件。
採用上面的賦值方法時,只有當賦的值不超過這個區間的時候,才會從快取中取出已經建立好的Integer物件的地址;當超出這個範圍的時候直接new Integer來建立Integer物件。
所以in5和in6雖然是採用int的賦值,但實際上和new Integer()沒有任何區別。

補充:

  1. Float、Double沒有快取池;
  2. Byte、Short、Int、Long的快取池都是1位元組[-128, 127];
  3. Character的快取池範圍是[0, 127] 。
Double d1 = 1.1;
Double d2 = 1.1;
System.out.println(d1 == d2);
//結果是false