8.1-全棧Java筆記:基本數(shù)據(jù)類型的包裝類

基本數(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?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 深入理解Java中的包裝類與自動(dòng)拆裝箱 文章出處:安卓進(jìn)階學(xué)習(xí)指南 作者:麥田哥(Whea...
    wheat7閱讀 2,750評(píng)論 2 11
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,895評(píng)論 0 11
  • 十幾年前,我們滿懷欣喜的迎接了這個(gè)小生命的到來。那一聲啼哭,帶來的是為父為母的滿滿的喜悅與幸福,從此暗下決心,要給...
    plm子衿閱讀 157評(píng)論 0 0
  • 住的小區(qū)是政府安置那些田地被征用的農(nóng)戶的,這里的每個(gè)家庭至少有兩套房子,一般一套是自己住,另外一套出租,多出的那套...
    殘劍閱讀 1,099評(píng)論 4 10
  • 閱讀對(duì)人性格的影響是一個(gè)潛移默化的過程,你自己不一定能感受到這種變化,但它確實(shí)在發(fā)生。年輕時(shí)閱讀的,往往價(jià)值不大,...
    小婦阿達(dá)閱讀 142評(píng)論 2 1

友情鏈接更多精彩內(nèi)容