一、什麼是裝箱,什麼是拆箱
裝箱:把基本資料型別轉換成包裝類別。
拆箱:把包裝類別轉換為基本資料型別。
基本資料型別所對應的包裝類別:
int(幾個位元組4)- Integer
byte(1)- Byte
short (2)- Short
long(8)- Long
float(4)- Float
double(8)- Double
char(2 )- Character
boolean(未定義)- Boolean
免費線上影片學習教學推薦:java影片教學
二、先來看看手動裝箱和手動拆箱
例子:拿int和Integer舉例
Integer i1=Integer.valueOf(3); int i2=i1.intValue();
手動裝箱是透過valueOf完成的,大家都知道= 右邊值賦給左邊,3是一個int類型的,賦給左邊就變成了Integer包裝類別。
手動拆箱是透過intValue()完成的,透過程式碼可以看到i1 從Integer變成了int
三、手動看完了,來看自動的
為了減輕技術人員的工作,java從jdk1.5之後變成自動裝箱與拆箱,還拿上面那個舉例:
手動:
Integer i1=Integer.valueOf(3); int i2=i1.intValue();
自動
Integer i1=3; int i2=i1;
這是已經預設自動裝好和拆好了。
四、從幾題目中加深對自動裝箱和拆箱的理解
(1)
Integer a = 100; int b = 100; System.out.println(a==b);结果为 true
原因:a 會自動拆箱和b 進行比較,所以為true
(2)
Integer a = 100; Integer b = 100; System.out.println(a==b);//结果为true Integer a = 200; Integer b = 200; System.out.println(a==b);//结果为false
這就發生一個有意思的事了,為什麼兩個變數一樣的,只有值不一樣的一個是true ,一個是false。
原因:這種情況就要說一下== 這個比較符號了,== 比較的記憶體位址,也就是new 出來的物件的記憶體位址,看到這你們可能會問這好像沒有new啊,但其實Integer a=200; 200前面是預設有new Integer的,所用記憶體位址不一樣== 比較的就是false了,但100為什麼是true呢?這是因為 java中的常數池 我們可以點開 Integer的源碼看看。
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; }
在對-128到127 之間的進行比較時,不會new 對象,而是直接到常數池中獲取,所以100是true,200超過了這個範圍然後進行了new 的操作,所以記憶體位址是不同的。
(3)
Integer a = new Integer(100); Integer b = 100; System.out.println(a==b); //结果为false
這跟上面那個100的差不多啊,從常數池中拿,為什麼是false呢?
原因:new Integer(100)的原因,100雖然可以在常數池中拿,但架不住你直接給new 了一個物件啊,所用這兩個記憶體位址是不同的。
(4)
Integer a = 100; Integer b= 100; System.out.println(a == b); //结果true a = 200; b = 200; System.out.println(c == d); //结果为false
原因:= 號右邊值賦給左邊a,b已經是包裝類了,200不在常數池中,把int 類型200 賦給包裝類,自動裝箱又因為不在常數池中所以預設new了對象,所以結果為false。
更多相關文章教學可以存取:java語言入門
#以上是深入理解java中的自動裝箱與拆箱的詳細內容。更多資訊請關注PHP中文網其他相關文章!