您好,登錄后才能下訂單哦!
如何進行Java中自動裝箱和自動拆箱原理剖析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
Java中數據類型可以劃分為兩種,一種是Primitive Type(基本類型),另外一種是Reference Type(引用類型)。基本類型的數值不是Object對象,不能調用對象的toString()、getClass()等方法。Java提供了針對每種基本類型的包裝類型,如下圖所示:
Java 基本數據(Primitive)類型的自動裝箱(autoboxing)、拆箱(autounboxing)是自J2SE 5.0開始提供的功能。Java語言規范中提到在很多情況下自動裝箱和自動拆箱是由編譯器自行完成的。該情況下包裝成為裝箱,解包裝稱為拆箱。
自動裝箱 Java 八種基本數據類型在某些條件下使用會自動變為對應的包裝器類型,舉例 Integer(int)類型如下:
@Test
public void boxing(){
Integer i1 = 10;
Integer i2 = 10;
Integer i3 = 128;
Integer i4 = 128;
System.out.println("i1==i2: " + (i1 == i2));
System.out.println("i3==i4: " + (i3 == i4));
System.out.println("i1.equals(i2): " + i1.equals(i2));
System.out.println("i3.equals(i4): " + i3.equals(i4));
}
輸出結果如圖:
1.當包裝器類型進行“==”比較時,i3會調用 Integer.valueOf() 自動裝箱基本數據類型為包裝器類型,源碼如下:
Integer 對象自動緩存int值范圍在low~high(-128~127),如果超出這個范圍則會自動裝箱為包裝類。
2.Integer包裝類實現 equals 方法中,只要比較的當前對象是 Integer 實例就會自動拆箱為基本數據類型。Integer類的equals方法的源碼如下:
而其他類型實現如下:
1)Integer、Short、Byte、Character、Long這幾個包裝類 valueOf() 或者 intValue() 方法實現類似
2)Double、Float的 valueOf() 或者 intValue() 方法的實現類似
3)Boolean的 valueOf() 或者 intValue() 方法實現是個三目運算,如 return (b ? TRUE : FALSE);
自動拆箱 Java 八種包裝器類型在某些條件下使用會自動變為對應的基本數據類型,舉例 int(Integer)類型如下:
@Test
public void boxing(){
Integer i1 = 10;
int i2 = 10;
int i3 = 128;
Integer i4 = 128;
System.out.println("i1==i2: " + (i1 == i2));
System.out.println("i3==i4: " + (i3 == i4));
}
輸出結果如圖:
程序執行時i4會調用 Integer.intValue() 方法自動拆箱包裝器類型為基本數據類型,源碼如下:
包裝器類型和基本數據類型進行“==”比較時,包裝器類型會自動拆箱為基本數據類型。
源碼參考:http://blog.yoodb.com/yoodb/article/detail/1085,微信“引用”功能,會導致java編碼格式問題,建議手動敲寫代碼或者源碼參考此路徑。
注意:equals() 比較的是兩個對象的值(內容)是否相同,而 "==" 比較的是兩個對象的引用(內存地址)是否相同,也用來比較兩個基本數據類型(int)的變量值是否相等。“==”運算符的兩個操作數都是包裝器類型的引用時比較指向的是否是同一個對象,而其中有一個操作數是表達式(即包含算術運算)則比較的是數值(即會觸發自動拆箱的過程),對于包裝器類型 equals 方法并不會進行類型轉換。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。