基本資料型別的封裝類
技術標籤:JAVA
建立方法
構造方法
以Integer型別為例,提供兩種構造方法,一種是以對應的基本資料型別為引數的構造方法,一種是以字串為引數的構造方法。
1、Integer (int number);
2、Integer (String str);
直接使用基本資料型別賦值
這裡有兩個概念:裝箱和拆箱。
Integer in1 = 1;
在這種直接賦值的情況下,會自動將基本資料型別裝箱成對應的封裝類物件,然後賦值給封裝類物件。
int i0 = 10;
Integer in0 = 10;
System.out.println(i0 == in0);
思考:一個基本資料型別和一個封裝類的物件之間使用==比較,是比較數值還是地址?
易錯點
在學習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()沒有任何區別。
補充:
- Float、Double沒有快取池;
- Byte、Short、Int、Long的快取池都是1位元組[-128, 127];
- Character的快取池範圍是[0, 127] 。
Double d1 = 1.1;
Double d2 = 1.1;
System.out.println(d1 == d2);
//結果是false