一侥涵、詳解Java的自動裝箱與拆箱(Autoboxing and unboxing)
https://www.cnblogs.com/wang-yaz/p/8516151.html
Integer total = 99; // 反編譯后,實際代碼:Integer total = Integer.valueOf(99);扣墩,自動裝箱:.valueOf()
int totalprim = total; // int totalprim = total.intValue();广辰,自動拆箱:.intValue()
Integer i = 100;
int j = 99;
Object k = i + j;// i3是Integer類型叉信,因為有Object?
public static void main(String[] args) {
/*
public static Integer valueOf(int i) {
return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}
private static final Integer[] SMALL_VALUES = new Integer[256]; SMALL_VALUES[0] = -128
*/
Integer i1 = 127; // 小于128拆檬,在提前創(chuàng)建的SMALL_VALUES中取用约素,所以是同一個對象
Integer i2 = 127;
Integer i3 = 128; // 無論如何,都new新的Integer
Integer i4 = 128;
System.out.println("i1 = i2:" + (i1 == i2)); // true
System.out.println("i3 = i4:" + (i3 == i4)); // false
Double d1 = 127.0; // Double中間有無數(shù)個數(shù)贝攒,無法先創(chuàng)建好數(shù)組供選擇盗誊,只能每次都new Double()
Double d2 = 127.0;
Double d3 = 128.0;
Double d4 = 128.0;
System.out.println("d1 = d2:" + (d1 == d2)); // false
System.out.println("d3 = d4:" + (d3 == d4)); // false
Integer i5 = 100;
int i6 = 100;
Long l1 = 200L;
1、當(dāng)一個基礎(chǔ)數(shù)據(jù)類型與封裝類進行==隘弊、+哈踱、-、*梨熙、/運算時开镣,會將封裝類進行拆箱,對基礎(chǔ)數(shù)據(jù)類型進行運算咽扇。
2邪财、對于l1.equals(i5 + i6)為false的原因很簡單,我們還是根據(jù)代碼實現(xiàn)來說明:
3质欲、當(dāng) “==”運算符的兩個操作數(shù)都是 包裝器類型的引用树埠,則是比較指向的是否是同一個對象;而如果其中有一個操作數(shù)是表達式(即包含算術(shù)運算)則比較的是數(shù)值(即會觸發(fā)自動拆箱的過程)嘶伟。
@Override
public boolean equals(Object o) {
return (o instanceof Long) && (((Long) o).value == value);
}
它必須滿足兩個條件才為true:
1怎憋、類型相同
2、內(nèi)容相同
*/
System.out.println("i5 = i6:" + (i5 == i6)); //true
//先對l1拆箱九昧,然后對i5绊袋、i6拆箱,進行運算比較
System.out.println("i5 + i6 = l1:" + (l1 == (i6 + i5))); //true
System.out.println("i5 + i6 equals l1:" + (l1.equals((i6 + i5)))); //false
}
- 總結(jié):
1铸鹰、需要知道什么時候會引發(fā)裝箱和拆箱愤炸。
2、裝箱操作會創(chuàng)建對象掉奄,頻繁的裝箱操作會消耗許多內(nèi)存规个,影響性能,所以可以避免裝箱的時候應(yīng)該盡量避免姓建。
3诞仓、equals(Object o) 因為原equals方法中的參數(shù)類型是封裝類型,所傳入的參數(shù)類型是原始數(shù)據(jù)類型速兔,所以會自動對其裝箱墅拭,反之,會對其進行拆箱涣狗。
4谍婉、當(dāng)兩種不同類型用==比較時舒憾,包裝器類的需要拆箱, 當(dāng)同種類型用==比較時穗熬,會自動拆箱或者裝箱镀迂。