基本數(shù)據(jù)類型的包裝類
包裝類基本知識
Java是面向?qū)ο蟮恼Z言号坡,但不是“純面向?qū)ο蟆卑揪埽緮?shù)據(jù)類型就不是對象。但是我們在實際使用中經(jīng)常需要將基本數(shù)據(jù)轉(zhuǎn)化成對象柄慰,便于操作。?比如:Object[]數(shù)組税娜、集合的操作中坐搔。
為了解決這個不足,在設(shè)計類時為每個基本數(shù)據(jù)類型設(shè)計了一個對應(yīng)的類進行代表敬矩,這樣八個和基本數(shù)據(jù)類型對應(yīng)的類統(tǒng)稱為包裝類(Wrapper Class)概行。
包裝類的作用是:實現(xiàn)基本數(shù)據(jù)類型、包裝類對象弧岳、字符串和數(shù)字轉(zhuǎn)換等凳忙。
【示例1】初識包裝類
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ù)類型的對應(yīng)關(guān)系如表所示:
在這八個類名中,除了Integer和Character類以外涧卵,其它六個類的類名和基本數(shù)據(jù)類型一致勤家,只是類名的第一個字母大寫即可。
在這八個類中柳恐,除了Character和Boolean都是“數(shù)字型”伐脖,數(shù)字型是java.lang.Number的子類。Number類是抽象類乐设,因此它的抽象方法讼庇,所有子類都需要提供實現(xiàn)。Number類提供了抽象方法:intValue()近尚、longValue()蠕啄、floatValue()、doubleValue()戈锻,意味著所有的數(shù)字型包裝類都可以互相轉(zhuǎn)型歼跟。
包裝類的用途
對于包裝類說,這些類的用途主要包含兩種:
1.???作為和基本數(shù)據(jù)類型對應(yīng)的類類型存在舶沛,方便涉及到對象的操作嘹承。
2.???包含每種基本數(shù)據(jù)類型的相關(guān)屬性如最大值、最小值等如庭,以及相關(guān)的操作方法(這些操作方法的作用是在基本類型數(shù)據(jù)叹卷、包裝類對象、字符串之間提供轉(zhuǎn)化F核)骤竹。
【示例2】包裝類的使用
public?class?Test {
??? /**
??? ?*?測試Integer的用法,其他包裝類類似
??? ?*/
????void?testInteger(){
???????//基本類型轉(zhuǎn)化成Integer對象
?????? Integer int1 =?new?Integer(10);
?????? Integer int2 = Integer.valueOf(20);??? //官方推薦這種寫法
???????//Integer對象轉(zhuǎn)化成int
???????int?a = int1.intValue();
???????//字符串轉(zhuǎn)化成Integer對象
?????? Integer int3 = Integer.parseInt("334");
?????? Integer int4 =?new?Integer("999");
???????//Integer對象轉(zhuǎn)化成字符串
?????? String str1 = int3.toString();
?????? System.out.println("int能表示的最大整數(shù):"+Integer.MAX_VALUE);? //一些常見int類型相關(guān)的常量
??? }
}
自動裝箱和拆箱
自動裝箱和拆箱就是將基本類型和包裝類進行自動的互相轉(zhuǎn)換往毡。JDK5.0后蒙揣,將自動裝箱(autoboxing)/拆箱(unboxing)引入Java中。
自動裝箱:基本類型數(shù)據(jù)處于需要對象的環(huán)境中時开瞭,會自動轉(zhuǎn)為“對象”懒震。
自動拆箱:每當需要一個值時,對象會自動轉(zhuǎn)成基本類型數(shù)據(jù)嗤详,?沒必要再去顯式調(diào)用intValue个扰、doubleValue()等轉(zhuǎn)型方法。
自動裝箱與拆箱的功能事實上是編譯器來幫您的忙葱色,編譯器在編譯時期依您所編寫的語法递宅,決定是否進行裝箱或拆箱動作,如7-3所示。
【示例3】自動裝箱
Integer i = 100;
//相當于編譯器自動為您作以下的語法編譯:
Integer i =?new?Integer(100);?
所以自動裝箱與拆箱的功能是所謂的“編譯器蜜糖”(Compiler Sugar)办龄,雖然使用這個功能很方便烘绽,但在程序運行階段您得了解Java的語義。例如7-4所示的程序是可以通過編譯的:
【示例4】包裝類空指針異常問題
Integer i =?null;
int?j = i;
//這樣的語法在編譯時期是合法的俐填,但是在運行時期會有錯誤安接,因為這種寫法相當于:
Integer i =?null;
int?j = i.intValue();
null表示i沒有參考至任何的對象實體,它可以合法地指定給對象參考名稱英融。由于實際上i并沒有參考至任何的對象赫段,所以也就不可能操作intValue()方法,這樣上面的寫法在運行時會出現(xiàn)NullPointerException錯誤矢赁。
【示例5】自動裝箱與拆箱
??? /**
??? ?*?測試自動裝箱和拆箱
??? ?*?結(jié)論:雖然很方便,但是如果不熟悉特殊情況贬丛,可能會出錯撩银!
??? ?*/
????static?void?testBoxing(){
?????? Integer b = 23;??? //自動裝箱
???????int?a =?new?Integer(20);??? //自動拆箱
?????? //自動裝箱和拆箱,實際上是編譯器替我們完成了代碼的自動編譯豺憔,比如:Integer b = 23,?其實運行時執(zhí)行的仍然是:Integer b = new Integer(23);
???????//下面的問題我們需要注意:
//???? Integer? c = null;
//???? int d = c;??? //此處其實就是:c.intValue(),因此拋空指針異常额获。
??? }
·[-128,127]緩存問題
自動裝箱時,對于-128-127之間的值,?為了提高效率Integer類會進行緩存處理恭应,?這個區(qū)間的值仍然會當做基本數(shù)據(jù)類型處理抄邀,這個范圍之外當做對象來處理。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);
??? }
測試代碼如下:
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之間昼榛,仍然會當做基本數(shù)據(jù)類型
??? System.out.println(h2==u2);?//false?會當做真正對象處理
}
?
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記境肾。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗胆屿,曾在神州數(shù)碼奥喻、航天院某所研發(fā)中心從事軟件設(shè)計及研發(fā)工作,從小白逐漸做到工程師非迹、高級工程師环鲤、架構(gòu)師。精通Java平臺軟件開發(fā)憎兽,精通JAVAEE冷离,熟悉各種流行開發(fā)框架。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數(shù)據(jù)庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從了解到實戰(zhàn)
E-Java高級框架精解
F-Linux和Hadoop?