1.Java數據類型 在介紹Java的自動裝箱和拆箱之前,我們先來瞭解一下Java的基本數據類型。 在Java中,數據類型可以分為兩大種,Primitive Type(基本類型)和Reference Type(引用類型)。基本類型的數值不是對象,不能調用對象的toString()、hashCode( ...
1.Java數據類型
在介紹Java的自動裝箱和拆箱之前,我們先來瞭解一下Java的基本數據類型。
在Java中,數據類型可以分為兩大種,Primitive Type(基本類型)和Reference Type(引用類型)。基本類型的數值不是對象,不能調用對象的toString()、hashCode()、getClass()、equals()等方法。所以Java提供了針對每種基本類型的包裝類型。如下:
INDEX | 基本類型 | 大小 | 數值範圍 | 預設值 | 包裝類型 |
1 | boolean | --- | true,false | false | Boolean |
2 | byte | 8bit | -2^7 -- 2^7-1 | 0 | Byte |
3 | char | 16bit |
\u0000 - \uffff |
\u0000 | Character |
4 | short | 16bit | -2^15 -- 2^15-1 | 0 | Short |
5 | int | 32bit | -2^31 -- 2^31-1 | 0 | Integer |
6 | long | 64bit | -2^63 -- 2^63-1 | 0 | Long |
7 | float | 32bit | IEEE 754 | 0.0f | Float |
8 | double | 64bit | IEEE 754 | 0.0d | Double |
9 | void | --- | --- | --- | Void |
2.Java自動裝箱和拆箱定義
Java 1.5中引入了自動裝箱和拆箱機制:
(1)自動裝箱:把基本類型用它們對應的引用類型包裝起來,使它們具有對象的特質,可以調用toString()、hashCode()、getClass()、equals()等方法。
如下:
Integer a=3;//這是自動裝箱
其實編譯器調用的是static Integer valueOf(int i)這個方法,valueOf(int i)返回一個表示指定int值的Integer對象,那麼就變成這樣:
Integer a=3; => Integer a=Integer.valueOf(3);
(2)自動拆箱:跟自動裝箱的方向相反,將Integer及Double這樣的引用類型的對象重新簡化為基本類型的數據。
如下:
int i = new Integer(2);//這是拆箱
編譯器內部會調用int intValue()返回該Integer對象的int值
註意:自動裝箱和拆箱是由編譯器來完成的,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動作。
3.基本數據類型與對象的差別
- 基本數據類型不是對象,也就是使用int、double、boolean等定義的變數、常量。
- 基本數據類型沒有可調用的方法。
eg: int t = 1; t. 後面是沒有方法。 Integer t =1; t. 後面就有很多方法可讓你調用了。
4.什麼時候自動裝箱
Integer i = 10; //裝箱 int t = i; //拆箱,實際上執行了 int t = i.intValue();
在進行運算時,也可以進行拆箱。
Integer i = 10;
System.out.println(i++);
5.什麼時候自動裝箱
//在-128~127 之外的數 Integer i1 =200; Integer i2 =200; System.out.println("i1==i2: "+(i1==i2)); // 在-128~127 之內的數 Integer i3 =100; Integer i4 =100; System.out.println("i3==i4: "+(i3==i4));
輸出的結果
i1==i2: false i3==i4: true
說明:
equals() 比較的是兩個對象的值(內容)是否相同。
"==" 比較的是兩個對象的引用(記憶體地址)是否相同,也用來比較兩個基本數據類型的變數值是否相等。
前面說過,int 的自動裝箱,是系統執行了 Integer.valueOf(int i),先看看Integer.java的源碼:
public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) // 沒有設置的話,IngegerCache.high 預設是127 return IntegerCache.cache[i + 128]; else return new Integer(i); }
對於–128到127(預設是127)之間的值,Integer.valueOf(int i) 返回的是緩存的Integer對象(並不是新建對象)
所以範例中,i3 與 i4實際上是指向同一個對象。
而其他值,執行Integer.valueOf(int i) 返回的是一個新建的 Integer對象,所以範例中,i1與i2 指向的是不同的對象。
當然,當不使用自動裝箱功能的時候,情況與普通類對象一樣,請看下例:
Integer i3 =new Integer(100); Integer i4 =new Integer(100); System.out.println("i3==i4: "+(i3==i4));//顯示false
致謝:感謝您的耐心閱讀!