基本數(shù)據(jù)類型的包裝類
包裝類基本知識(shí)
Java是面向?qū)ο蟮恼Z(yǔ)言,但不是“純面向?qū)ο蟆?,基本?shù)據(jù)類型就不是對(duì)象。但是我們?cè)趯?shí)際使用中經(jīng)常需要將基本數(shù)據(jù)轉(zhuǎn)化成對(duì)象,便于操作。?比如:Object[]數(shù)組、集合的操作中。
為了解決這個(gè)不足,在設(shè)計(jì)類時(shí)為每個(gè)基本數(shù)據(jù)類型設(shè)計(jì)了一個(gè)對(duì)應(yīng)的類進(jìn)行代表,這樣八個(gè)和基本數(shù)據(jù)類型對(duì)應(yīng)的類統(tǒng)稱為包裝類(Wrapper Class)。
包裝類的作用是:實(shí)現(xiàn)基本數(shù)據(jù)類型、包裝類對(duì)象、字符串和數(shù)字轉(zhuǎn)換等。
【示例1】初識(shí)包裝類
public?class?WrapperClassTest {
????public?static?void?main(String[] args){
?????? Integer i=new?Integer(10);
?????? Integer j=new?Integer(50);
??? }??
}
?示例1?內(nèi)存分析圖
包裝類均位于java.lang包,包裝類和基本數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系如表所示:
在這八個(gè)類名中,除了Integer和Character類以外,其它六個(gè)類的類名和基本數(shù)據(jù)類型一致,只是類名的第一個(gè)字母大寫即可。
在這八個(gè)類中,除了Character和Boolean都是“數(shù)字型”,數(shù)字型是java.lang.Number的子類。Number類是抽象類,因此它的抽象方法,所有子類都需要提供實(shí)現(xiàn)。Number類提供了抽象方法:intValue()、longValue()、floatValue()、doubleValue(),意味著所有的數(shù)字型包裝類都可以互相轉(zhuǎn)型。

包裝類的用途
對(duì)于包裝類說,這些類的用途主要包含兩種:
1.???作為和基本數(shù)據(jù)類型對(duì)應(yīng)的類類型存在,方便涉及到對(duì)象的操作。
2.???包含每種基本數(shù)據(jù)類型的相關(guān)屬性如最大值、最小值等,以及相關(guān)的操作方法(這些操作方法的作用是在基本類型數(shù)據(jù)、包裝類對(duì)象、字符串之間提供轉(zhuǎn)化?。?/p>
【示例2】包裝類的使用
public?class?Test {
??? /**
??? ?*?測(cè)試Integer的用法,其他包裝類類似
??? ?*/
????void?testInteger(){
???????//基本類型轉(zhuǎn)化成Integer對(duì)象
?????? Integer int1 =?new?Integer(10);
?????? Integer int2 = Integer.valueOf(20);??? //官方推薦這種寫法
???????//Integer對(duì)象轉(zhuǎn)化成int
???????int?a = int1.intValue();
???????//字符串轉(zhuǎn)化成Integer對(duì)象
?????? Integer int3 = Integer.parseInt("334");
?????? Integer int4 =?new?Integer("999");
???????//Integer對(duì)象轉(zhuǎn)化成字符串
?????? String str1 = int3.toString();
?????? System.out.println("int能表示的最大整數(shù):"+Integer.MAX_VALUE);? //一些常見int類型相關(guān)的常量
??? }
}
自動(dòng)裝箱和拆箱
自動(dòng)裝箱和拆箱就是將基本類型和包裝類進(jìn)行自動(dòng)的互相轉(zhuǎn)換。JDK5.0后,將自動(dòng)裝箱(autoboxing)/拆箱(unboxing)引入Java中。
自動(dòng)裝箱:基本類型數(shù)據(jù)處于需要對(duì)象的環(huán)境中時(shí),會(huì)自動(dòng)轉(zhuǎn)為“對(duì)象”。
自動(dòng)拆箱:每當(dāng)需要一個(gè)值時(shí),對(duì)象會(huì)自動(dòng)轉(zhuǎn)成基本類型數(shù)據(jù),?沒必要再去顯式調(diào)用intValue、doubleValue()等轉(zhuǎn)型方法。
自動(dòng)裝箱與拆箱的功能事實(shí)上是編譯器來幫您的忙,編譯器在編譯時(shí)期依您所編寫的語(yǔ)法,決定是否進(jìn)行裝箱或拆箱動(dòng)作,如7-3所示。
【示例3】自動(dòng)裝箱
Integer i = 100;
//相當(dāng)于編譯器自動(dòng)為您作以下的語(yǔ)法編譯:
Integer i =?new?Integer(100);?
所以自動(dòng)裝箱與拆箱的功能是所謂的“編譯器蜜糖”(Compiler Sugar),雖然使用這個(gè)功能很方便,但在程序運(yùn)行階段您得了解Java的語(yǔ)義。例如7-4所示的程序是可以通過編譯的:
【示例4】包裝類空指針異常問題
Integer i =?null;
int?j = i;
//這樣的語(yǔ)法在編譯時(shí)期是合法的,但是在運(yùn)行時(shí)期會(huì)有錯(cuò)誤,因?yàn)檫@種寫法相當(dāng)于:
Integer i =?null;
int?j = i.intValue();
null表示i沒有參考至任何的對(duì)象實(shí)體,它可以合法地指定給對(duì)象參考名稱。由于實(shí)際上i并沒有參考至任何的對(duì)象,所以也就不可能操作intValue()方法,這樣上面的寫法在運(yùn)行時(shí)會(huì)出現(xiàn)NullPointerException錯(cuò)誤。
【示例5】自動(dòng)裝箱與拆箱
??? /**
??? ?*?測(cè)試自動(dòng)裝箱和拆箱
??? ?*?結(jié)論:雖然很方便,但是如果不熟悉特殊情況,可能會(huì)出錯(cuò)!
??? ?*/
????static?void?testBoxing(){
?????? Integer b = 23;??? //自動(dòng)裝箱
???????int?a =?new?Integer(20);??? //自動(dòng)拆箱
?????? //自動(dòng)裝箱和拆箱,實(shí)際上是編譯器替我們完成了代碼的自動(dòng)編譯,比如:Integer b = 23,?其實(shí)運(yùn)行時(shí)執(zhí)行的仍然是:Integer b = new Integer(23);
???????//下面的問題我們需要注意:
//???? Integer? c = null;
//???? int d = c;??? //此處其實(shí)就是:c.intValue(),因此拋空指針異常。
??? }
·[-128,127]緩存問題
自動(dòng)裝箱時(shí),對(duì)于-128-127之間的值,?為了提高效率Integer類會(huì)進(jìn)行緩存處理,?這個(gè)區(qū)間的值仍然會(huì)當(dāng)做基本數(shù)據(jù)類型處理,這個(gè)范圍之外當(dāng)做對(duì)象來處理。Integer類相關(guān)源碼如下:
????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);
??? }
測(cè)試代碼如下:
public?static?void?? main(String[] args) {
??? Integer h = 100;???? Integer ? u = 100;
??? Integer h2 = 200;??? Integer ? u2 = 200;
??? System.out.println(h==u);???//true -128-127之間,仍然會(huì)當(dāng)做基本數(shù)據(jù)類型
??? System.out.println(h2==u2);?//false?會(huì)當(dāng)做真正對(duì)象處理
}
?
「全棧Java筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗(yàn),曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作,從小白逐漸做到工程師、高級(jí)工程師、架構(gòu)師。精通Java平臺(tái)軟件開發(fā),精通JAVAEE,熟悉各種流行開發(fā)框架。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數(shù)據(jù)庫(kù)從入門到精通
C-手刃移動(dòng)前端和Web前端
D-J2EE從了解到實(shí)戰(zhàn)
E-Java高級(jí)框架精解
F-Linux和Hadoop?