java 之裝箱與拆箱的研究總結
阿新 • • 發佈:2019-02-12
今天看java JDK7的新特新語法糖的時候突然有提到裝箱與拆箱,就特地加深一下:
所謂裝箱:就是在程式碼編譯期將基本型別轉化為包裝型別,使其基本有型別具有物件特徵
所謂拆箱:與裝箱過程相反,就是把包裝型別轉為基本型別
自動裝箱/拆箱 就是程式碼在編譯根據程式碼的語法,決定是否裝箱或者拆箱!
一:先說說equals()和== 號的區別吧!
Integer,short的自動裝箱:
Integer a = -129; //超出-128 Integer b = -129; Integer c=1; Integer d=1; System.out.println(c==d); System.out.println(a==b);
輸出結果為:false,true。也就是說:
1:自動裝箱針對於值-128~127之間,他們被裝箱後會在記憶體中被重用!如果超過了這個區間那麼就不會被重用,也就相當於每次新建一個Integer 的物件!
再來說說equals()和== 號的區別吧:
Integer a = -129;
Integer b = -129;
System.out.println(a.equals(b));
System.out.println(a==b); //地址未被重用
輸出結果為:true false說明:
equals() 比較的是兩個物件的值(內容)是否相同。
"==" 比較的是兩個物件的引用(記憶體地址)是否相同,也用來比較兩個基本資料型別的變數值是否相等。
可以看出來 str1 str2引用的是同一物件,str3 str4卻是倆個不同的物件String str1 = "abc"; String str2 = "abc"; System.out.println(str2==str1); //輸出為 true System.out.println(str2.equals(str1)); //輸出為 true String str3 = new String("abc"); String str4 = new String("abc"); System.out.println(str3==str4); //輸出為 false System.out.println(str3.equals(str4)); //輸出為 true
注意:Integer i=3; 事實上呼叫的Integer.valueOf(int i); 裝箱是Integer.valueOf(int i),那麼拆箱是:i.intValue()!
需要注意的是:
包裝型別的“==”運算在沒有遇到算數運算子的情況下不會自動拆箱,而其包裝型別的equals()方法不會處理資料型別轉換,所以:
Integer a = 1;
Integer b = 1;
Long c = 1L;
System.out.println(a == b);
System.out.println(c.equals(a));
這樣的程式碼是有誤區的, 根本不會實現拆裝箱的操作!這樣的程式碼應該儘量避免自動拆箱與裝箱。