java的自動裝箱和自動拆箱是什么?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站建設(shè)、網(wǎng)站制作網(wǎng)站策劃,項目實(shí)施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元沛縣做網(wǎng)站,已為上家服務(wù),為沛縣各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
自動拆箱和自動裝箱
Java為每種基本數(shù)據(jù)類型都提供了對應(yīng)的包裝器類型。舉個例子:
public class TestMain { public static void main(String[] args) { Integer i = 10; } }
這個過程中會自動根據(jù)數(shù)值創(chuàng)建對應(yīng)的Integer對象,這就是自動裝箱。再看另外一段代碼:
public class TestMain { public static void main(String[] args) { Integer integer = 10; int i = integer; } }
這個過程中會根據(jù)包裝器類型自動將數(shù)據(jù)轉(zhuǎn)換為基本類型,這就是自動拆箱。
至于自動裝箱和自動拆箱的原理也很簡單。通過命令行程序,進(jìn)入CLASSPATH(也就是bin目錄下.class文件所在的路徑),javap反編譯查看一下生成的字節(jié)碼:
反編譯出來的內(nèi)容有很多,我們只關(guān)注重點(diǎn)部分:
public static void main(java.lang.String[]); flags: ACC_PUBLIC, ACC_STATIC Code: stack=1, locals=3, args_size=1 0: iconst_1 1: invokestatic #16 // Method java/lang/Integer.valueO f:(I)Ljava/lang/Integer; 4: astore_1 5: aload_1 6: invokevirtual #22 // Method java/lang/Integer.intVal ue:()I 9: istore_2 10: return
看到在自動裝箱的時候,Java虛擬機(jī)會自動調(diào)用Integer的valueOf方法;在自動拆箱的時候,Java虛擬機(jī)會自動調(diào)用Integer的intValue方法。這就是自動拆箱和自動裝箱的原理。
小心空指針異常
有這么一段代碼:
public static void main(String[] args) throws Exception { Object obj = getObj(null); int i = (Integer)obj; } public static Object getObj(Object obj) { return obj; }
這種使用場景很常見,我們把一個int數(shù)值放在session或者request中,取出來的時候就是一個類似上面的場景了。所以,小心自動拆箱時候的空指針異常。
小陷阱
看兩段代碼,第一段代碼為:
public class TestMain { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println(i1 == i2); System.out.println(i3 == i4); } }
運(yùn)行結(jié)果為:
true false
第二段代碼為:
public class TestMain { public static void main(String[] args) { Double d1 = 100.0; Double d2 = 100.0; Double d3 = 200.0; Double d4 = 200.0; System.out.println(d1 == d2); System.out.println(d3 == d4); } }
運(yùn)行結(jié)果為:
false false
產(chǎn)生這樣的結(jié)果的原因是:Byte、Short、Integer、Long、Char這幾個裝箱類的valueOf()方法是以128位分界線做了緩存的,假如是128以下且-128以上的值是會取緩存里面的引用的,以Integer為例,其valueOf(int i)的源代碼為:
public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; } return new Integer(i); }
而Float、Double則不會,原因也很簡單,因為byte、Short、integer、long、char在某個范圍內(nèi)的整數(shù)個數(shù)是有限的,但是float、double這兩個浮點(diǎn)數(shù)卻不是。
關(guān)于java的自動裝箱和自動拆箱是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。