亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java自動裝箱與拆箱

2019-11-14 08:46:38
字體:
來源:轉載
供稿:網友

1.前言

最近在看關于優化的知識,看到關于裝箱與拆箱的效率問題,故整理了一下關于此的知識點

2.概念

什么是自動裝箱和拆箱

自動裝箱就是java自動將原始類型值轉換成對應的對象,比如將int的變量轉換成Integer對象,這個過程叫做裝箱,反之將Integer對象轉換成int類型值,這個過程叫做拆箱。因為這里的裝箱和拆箱是自動進行的非人為轉換,所以就稱作為自動裝箱和拆箱。原始類型byte,short,char,int,long,float,double和boolean對應的封裝類為Byte,Short,Character,Integer,Long,Float,Double,Boolean。

何時發生自動裝箱和拆箱

自動裝箱和拆箱在Java中很常見,比如我們有一個方法,接受一個對象類型的參數,如果我們傳遞一個原始類型值,那么Java會自動講這個原始類型值轉換成與之對應的對象。最經典的一個場景就是當我們向ArrayList這樣的容器中增加原始類型數據時或者是創建一個參數化的類,比如下面的ThreadLocal。

ArrayList<Integer> intList = new ArrayList<Integer>();intList.add(1); //autoboxing - PRimitive to objectintList.add(2); //autoboxingThreadLocal<Integer> intLocal = new ThreadLocal<Integer>();intLocal.set(4); //autoboxingint number = intList.get(0); // unboxingint local = intLocal.get(); // unboxing in Java

由上可知,裝箱是java內部自動完成,眾所周知對于java的重載是以入參格式來判斷,而不依賴于返回值;當發生重載時,到底會不會發生自動裝箱,下面將舉例說明

public class Test { public void test(int num){ System.out.println("int"); } public void test(Integer num){ System.out.println("Integer"); } public static void main(String[] args) { Test test = new Test(); Integer c = 12; int d = 34; test.test(c); test.test(d); }}

結果:

Integerint

由上可知,當出現這種情況時,不會發生自動裝箱操作。

3.注意事項

3.1.null問題

有拆箱操作時一定要特別注意封裝類對象是否為null

代碼:

Integer a = null;int b = a;

結果:

Exception in thread "main" java.lang.NullPointerException at com.molly.test.Test.main(Test.java:30) at sun.reflect.NativeMethodaccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

這兩行代碼是完全合法的,完全能夠通過編譯的,但是在運行時,就會拋出空指針異常。其中,a為Integer類型的對象,它當然可以指向null。但在第二行時,就會對a進行拆箱,也就是對一個null對象執行intValue()方法,當然會拋出空指針異常。

3.2.等于問題

”==“可以用于原始值進行比較,也可以用于對象進行比較,當用于對象與對象之間比較時,比較的不是對象代表的值,而是檢查兩個對象是否是同一對象,這個比較過程中沒有自動裝箱發生。進行對象值比較不應該使用”==“,而應該使用對象對應的equals方法 實例:

Integer a = 1233;int b = 1233;System.out.println(a == b);

上面例子中a是對象類型,而b是基本類型,大家都知道對象類型是地址,而基本類型是值,是不相等的,但是由于引用了intValue()方法發生了自動拆箱操作,所以輸出結果是true;

Integer a = 1233;Integer b = 1233;System.out.println(a == b);

可能大家都會認為上面的代碼輸出應該是true,實際卻是false ,這是因為 a和b的初始化都發生了自動拆箱操作。但是處于節省內存的考慮,JVM會緩存-128到127的Integer對象。但是這個時候a、b已經超出范圍,a和b實際上不是同一個對象。所以使用”==“比較返回false。那么如何a、b比較相等呢,在int的取值范圍(-2的31次方到2的31次方-1)可以用: System.out.println(a.intValue() == b.intValue());來進行Integer之間比較

3.3.Integer.parseInt與Integer.valueOf比較

在對字符串轉化為整型比較時,也要注意自動拆箱問題 例如:

String a = "23";String b = "23";System.out.println(Integer.valueOf(a) == Integer.valueOf(b));

結合3.2.中的描述不能看出上面輸出true 但是當不再-128到127范圍內,則輸出為false這是因為 valueOf(String s )也是Integer類的靜態方法,它的作用是將形參 s 轉化為Integer對象,那么如何比較轉化的輸出為true,可用parseInt(String s ),它是類Integer的靜態方法,它的作用就是將形參 s 轉化為int.也可以這樣輸出:

System.out.println(Integer.parseInt(a) == Integer.parseInt(b));

或者

System.out.println(Integer.valueOf(a).intValue() == Integer.valueOf(b).intValue());

或者

System.out.println(Integer.parseInt(a) == Integer.valueOf(b));

或者

System.out.println(a.equals(b));

4.備注

因為自動裝箱會隱式地創建對象,像前面提到的那樣,如果在一個循環體中,會創建無用的中間對象,這樣會增加GC壓力,拉低程序的性能。所以在寫循環時一定要注意代碼,避免引入不必要的自動裝箱操作。

5.String 的比較問題

看一下下面的兩個實例

public class Test { public static void main(String[] args) { String a = "ab"; String b = "a"; b +="b"; System.out.println(a == b); String c = "ab"; String d = "a" +"b"; System.out.println(c == d); String e = new String("ab"); System.out.println(c == e); }}

可能大家認為String是對象類型,那么三個輸出都是false,實際上卻不是,這里不得不說一下,字符串常量池的概念

當代碼中出現字面量形式創建字符串對象時,JVM首先會對這個字面量進行檢查,如果字符串常量池中存在相同內容的字符串對象的引用,則將這個引用返回,否則新的字符串對象被創建,然后將這個引用放入字符串常量池,并返回該引用。

由于b是一個String變量,編譯期無法確定b的值,故不會優化為一個字符串。即使我們知道b的值,但JVM認為它是個變量,變量的值只能在運行期才能確定,故不會優化。運行期字符串的+連接符相當于new,故該行代碼在Heap中創建了一個內容為“計算機軟件”的String對象,并返回該對象的引用,所以第一個打印是false,而第二個中d直接指向c的地址,所以打印是true,當我們使用了new來構造字符串對象的時候,不管字符串常量池中有沒有相同內容的對象的引用,新的字符串對象都會創建,所以第三個打印是false


上一篇:26.Yii 模塊(2)

下一篇:1048. Find Coins (25)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性jizz18性欧美| 亚洲色图17p| 日韩一区二区三区国产| 91精品国产自产在线| 日本久久久久久久久久久| 亚洲第一福利网| 亚洲国产日韩一区| 97**国产露脸精品国产| 亚洲精美色品网站| 久久久久国色av免费观看性色| 青草青草久热精品视频在线网站| 久久久久久久999| 黑人巨大精品欧美一区二区免费| 欧美激情在线视频二区| 国产一区二区三区精品久久久| 日韩福利视频在线观看| 欧美亚洲视频在线看网址| 亚洲欧洲av一区二区| 国产精品青青在线观看爽香蕉| 日韩成人在线网站| 日韩精品有码在线观看| 成人精品久久久| 国产亚洲xxx| 96精品视频在线| 91啪国产在线| 久久精品在线播放| 欧美国产日韩二区| 欧美黑人狂野猛交老妇| 欧美黑人xxx| 国产精品日韩av| 麻豆国产精品va在线观看不卡| 欧美日韩色婷婷| 精品国产乱码久久久久久婷婷| 国产精品午夜视频| 欧美性极品少妇精品网站| 亚洲激情视频网| 精品无人区太爽高潮在线播放| 亚洲国产高潮在线观看| 亚洲精品一区二区在线| 亚洲最新av网址| 亚洲国产精品国自产拍av秋霞| 国产亚洲欧美另类中文| 日韩av免费在线观看| 国产亚洲欧美aaaa| 久久久精品美女| 久久久久国产视频| 色琪琪综合男人的天堂aⅴ视频| 成人性生交大片免费看视频直播| 国产97在线亚洲| 国产精选久久久久久| 久久亚洲欧美日韩精品专区| 亚洲人午夜精品| 久久视频免费在线播放| 国产精品黄色影片导航在线观看| 欧美日韩999| 欧美黑人视频一区| 国产成人a亚洲精品| 日本一欧美一欧美一亚洲视频| 国产精品久久久久久久av大片| 97精品视频在线播放| 夜夜狂射影院欧美极品| 91免费精品国偷自产在线| 欧美国产日韩一区二区| 国产欧美在线播放| 午夜精品在线视频| 欧美亚洲免费电影| 国产亚洲日本欧美韩国| 欧美午夜女人视频在线| 欧美激情综合色| 亚洲成人av片在线观看| 欧美一级黑人aaaaaaa做受| 国产a∨精品一区二区三区不卡| 国产精品久久久久久久久久99| 久久不射电影网| 色偷偷88888欧美精品久久久| 中文字幕欧美专区| 亚洲最大中文字幕| 亚洲小视频在线观看| 伦伦影院午夜日韩欧美限制| 欧美裸体男粗大视频在线观看| 国产精品日日做人人爱| 国产精品激情av电影在线观看| 欧美日韩在线观看视频| 欧美乱妇高清无乱码| 国产精品天天狠天天看| 国产丝袜高跟一区| 国产91久久婷婷一区二区| 精品国内自产拍在线观看| 欧美成人精品在线播放| 精品五月天久久| 亚洲精品456在线播放狼人| 亚洲三级av在线| 亚洲娇小xxxx欧美娇小| 国产一区二中文字幕在线看| 国产日韩av高清| 亚洲人午夜色婷婷| 国产精品av电影| 色综合久综合久久综合久鬼88| 日韩av网址在线| 日韩免费av一区二区| 91成人在线观看国产| 国产精品免费观看在线| 国产精品久久av| 欧美一区二区三区免费视| 最近更新的2019中文字幕| 日韩小视频在线| 国产有码一区二区| 欧美精品videossex88| 国产成+人+综合+亚洲欧美丁香花| 久久这里有精品视频| 国产精品久久精品| 日韩av不卡电影| 亚洲性69xxxbbb| 欧美夫妻性生活视频| 日韩电影中文字幕一区| 欧美成年人在线观看| 国产一区二区三区三区在线观看| 69国产精品成人在线播放| 日韩电视剧免费观看网站| 日韩久久免费视频| 久久的精品视频| 2019中文字幕在线免费观看| 97超碰国产精品女人人人爽| 国产欧美韩国高清| 国产区精品视频| 国产精品美女久久久久久免费| 亚洲成人久久久久| 日韩成人中文字幕| 精品视频久久久| 另类美女黄大片| 日韩欧美在线视频观看| 日本精品中文字幕| 亚洲新声在线观看| 永久免费看mv网站入口亚洲| 国产一区二区动漫| 神马国产精品影院av| 亚洲第一网站免费视频| 日韩不卡中文字幕| 久久激情五月丁香伊人| 色综合久综合久久综合久鬼88| 国产成人精品国内自产拍免费看| 热久久99这里有精品| 亚洲free性xxxx护士hd| 日韩亚洲精品视频| 国产日产欧美精品| 中文在线不卡视频| 亚洲综合在线播放| 久久久精品免费视频| 欧美色欧美亚洲高清在线视频| 欧美肥老太性生活视频| 亚洲福利小视频| 欧美激情免费在线| 成人高清视频观看www| 国产精品第一第二| 国产欧美亚洲视频| 国产精品欧美一区二区| 亚洲精品xxxx| 久久人人爽人人爽人人片av高请| 精品国产91久久久久久| 91久久夜色精品国产网站| 91av在线免费观看视频| 欧美老女人性视频| 97在线视频免费播放| 亚洲资源在线看|