自動裝箱和拆箱

2021-10-18 03:49:18 字數 2752 閱讀 2440

概念:裝箱就是自動將基本型別資料轉為包裝型別;拆箱就是自動將包裝型別轉為基本型別。

具體實現:

// 自動裝箱:

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...