一义起、自動(dòng)拆裝箱
????自動(dòng)裝箱過程就是通過調(diào)用valueOf方法實(shí)現(xiàn)(如:Integer.valueOf(10))拉背,而拆箱過程就是調(diào)用xxxValue方法實(shí)現(xiàn)(如Integer.intValue())。
自動(dòng)拆裝箱:
Integer a = 10;//自動(dòng)裝箱 --> ?Integer a =?Integer.valueOf(10);
int b = a; //自動(dòng)拆箱 --> int b = a.intValue();
二默终、緩存
Integer椅棺,Short,Long齐蔽,Byte两疚,Character包裝類型有緩存機(jī)制(cache數(shù)組)。
Boolean類型有TRUE和FALSE兩個(gè)靜態(tài)成員含滴。
????public static final Boolean TRUE = new Boolean(true);
????public static final Boolean FALSE = new Boolean(false);
Double和Float沒有緩存機(jī)制诱渤。
三、“==” 和“equals”比較(重點(diǎn))
?Integer有一個(gè)靜態(tài)方法valueOf(int i),當(dāng)自動(dòng)裝箱觸發(fā)時(shí)谈况,編譯器會(huì)自動(dòng)補(bǔ)充調(diào)用該方法的代碼勺美。
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);
? ? }
“==”運(yùn)算符是用來比較基本類型變量和引用類型變量递胧。
1、當(dāng)2個(gè)操作數(shù)都是包裝類型變量是赡茸,比較的是看它們是否指向同一個(gè)對(duì)象(既比較地址是否相同)
如:Integer a = 1; ? ?-->會(huì)自動(dòng)裝箱缎脾,即調(diào)用valueOf(1);
Integer b = 1; ? ? ?-->會(huì)自動(dòng)裝箱,即調(diào)用valueOf(1);
System.out.println(a == b); ? ? ? ? ? ? ? ?//true? ?
上面的Integer a = 1;? 和? Integer b = 1;因?yàn)?在-128-127之間占卧,所以裝箱后的Integer指向同一個(gè)地址遗菠,即 a == b返回true。若沒有在-128 - 127之間华蜒,這會(huì)new對(duì)象出來辙纬。new出來的對(duì)象,地址是不同的友多。
如:Integer a = 300; ? ? -->會(huì)自動(dòng)裝箱牲平,即調(diào)用valueOf(300);
Integer b = 300; ? ? ?-->會(huì)自動(dòng)裝箱,即調(diào)用valueOf(300);
System.out.println(a == b); ? ? ? ? ? ? ? ?//false?
2域滥、如果其中有一個(gè)操作數(shù)是表達(dá)式(既包含算術(shù)運(yùn)算)則會(huì)先進(jìn)行自動(dòng)拆箱纵柿,再進(jìn)行對(duì)應(yīng)的基本類型變量比較。
如:
int i = 3;
Integer a = 1;
Integer b = 2;
System.out.println(i == (a+b)) ? ? ? //true? 分別對(duì)a和b進(jìn)行了自動(dòng)拆箱操作启绰,然后再add運(yùn)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 算昂儒,之后再與i進(jìn)行比較,屬于數(shù)值比較委可。
如:
Integer a = 1;
Integer b = 2;
Integer c = 3;
System.out.println(c == (a+b)) ? ? //true? 分別對(duì)a,b和c進(jìn)行了自動(dòng)拆箱操作渊跋,之后再進(jìn)行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 數(shù)值比較。
3着倾、基本包裝類型重寫了equals方法拾酝,基本包裝類型的equals不會(huì)進(jìn)行類型的轉(zhuǎn)換,類型不同的包裝類型的變量直接判定為false卡者,盡管他們的數(shù)值可能是相等的蒿囤。
如:
Integer a = 1;
Long b = 1;
System.out.println(a.equals(b)) ? ? //false? 包裝類型不同,直接false
如:
Integer a = 300;
Integer b = 300;
System.out.println(a.equals(b)) ? ? //true? ? 包裝類型相同崇决,再判斷數(shù)值材诽,此處的a==b 是false
四、代碼練習(xí)
答案:
五恒傻、其他類型轉(zhuǎn)換為Integer對(duì)象
我們都知道創(chuàng)建一個(gè)Integer對(duì)象是
????Integer integer_1 = new Integer(10);
那么Inter還有什么其他方法呢脸侥?
1) 把int轉(zhuǎn)成Integer對(duì)象
????Integer integer_2 = Integer.valueOf(10);
2)?把String轉(zhuǎn)出Integer對(duì)象
? ? Integer integer_3 = Integer.valueOf("10");
3)?把String轉(zhuǎn)出int
? ? int a = Integer.parseInt("10");
4) System.out.println(integer_1 == integer_2); ? ? ? ? ? ? ?////判斷的是引用的地址,結(jié)果為false