概念:裝箱就是自動將基本型別資料轉為包裝型別;拆箱就是自動將包裝型別轉為基本型別。
具體實現:
// 自動裝箱:
integer total1 =99;
// 編譯後 integer total = integer.valueof(99)
// 自動拆箱
int total2 = total1;
// 編譯後 int total2 = total1.intvalue()
原始碼分析:
valueof
判斷i的大小是否在 [-128,127]
① 在,則從快取池中獲取integer物件
② 不在,則new乙個新物件
public
static integer valueof
(int i)
而快取池是在integercache(integer的乙個靜態內部類)進行類載入時建立的,具體**如下
static
catch
( numberformatexception nfe)
} high = h;
cache =
newinteger
[(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;
}
intvalue
這個就很簡單了
1
@override
2public
intintvalue()
public
class
main
}
兩個integer物件進行大小對比, 當值在[-128,127]之間,則返回true。否則返回false
建議:在寫**時不要用 == 來比較integer, 而是使用equals。
整型:integer、short、byte、character、long這幾個類是有快取池的。
浮點型:double、float是沒有快取池的。
boolean: 也類似快取池,但它內部只有兩個物件。
public
static
final boolean true =
newboolean
(true);
public
static
final boolean false =
newboolean
(false);
public
static boolean valueof
(boolean b)
① 當乙個包裝型別和乙個基本資料型別相遇時,會將包裝型別拆箱
1 integer num1 =
100;
2int num2 =
100;
3 long num3 =
200l;
4 system.out.
println
(num1 + num2)
;//200
5 system.out.
println
(num3 ==
(num1 + num2));
//true
6 system.out.
println
(num3.
equals
(num1 + num2));
//false
這裡分析第六行為什麼false
equals原始碼
1
@override
2public
boolean
equals
(object o)
可以發現,它必須滿足兩個條件才返回true
1、型別相同
2、內容相同
所以false是因為型別不同。
1 integer integer100=null;
2int int100=integer100;
這裡會丟擲空指標異常,原因是編譯後**為
1 integer integer100=null;
2int int100=integer100.
intvalue
(); // 這裡因為integer100為空,故丟擲空指標
當乙個基本資料型別和包裝型別進行 == 、 != 比較時,會將 包裝型別自動拆箱,而此時如果包裝型別為null,則會丟擲空指標異常。
1 integer a = null;
2int b =1;
3if(a == b)
裝箱和拆箱,自動裝箱和自動拆箱
以integer的建立為例。裝箱 把基本資料型別轉換成包裝類物件 int integer integer num1 new integer 17 拆箱 把乙個包裝類的物件,轉換成基本型別的變數 integer int int num2 num1.intvalue 自動裝箱 integer num3 ...
自動裝箱 和 自動拆箱
自動裝箱 auto boxing 基本型別就自動地封裝到與它相同型別的包裝中,如 integer i 100 本質上是,編譯器編譯時為我們新增了 integer i new integer 100 自動拆箱 unboxing 包裝類物件自動轉換成基本型別資料,如 int a new integer ...
自動裝箱和自動拆箱
public class test206 system.out.println tostring 1234,靜態方法 parseint string s 把數字字串變成int型別的數字 tobinarystring int i 把int數字變為二進位制數的字串形式 tooctalstring int...