Java中包裝類介紹與其注意事項(xiàng)
前言
大家都知道在Java中,除了8種基本數(shù)據(jù)類型外,其他的都是引用類型。使用引用類型是為了更好地貫徹面向?qū)ο蟮乃枷?,那為什么還要保留8種基本數(shù)據(jù)類型呢?
這其實(shí)更多地是照顧程序員的習(xí)慣。為了既照顧程序員的習(xí)慣,同時(shí)又能全面貫徹面向?qū)ο缶幊痰乃枷耄琂ava中引入了包裝類機(jī)制。
所謂的包裝類就是為8種基本數(shù)據(jù)類型分別定義了相應(yīng)的引用類型,其對(duì)應(yīng)關(guān)系如下:

顯然,除了int及char外,其余的包裝類都是將對(duì)應(yīng)的基本數(shù)據(jù)類型的首字母大寫(xiě)即可。 那為什么要引入包裝類呢?前面已經(jīng)說(shuō)過(guò),是為了全面貫徹面向?qū)ο蟮木幊趟枷?,具體地說(shuō)就是非引用類型的數(shù)據(jù)在使用時(shí)會(huì)有許多制約,比如List list=new ArrayList();對(duì)于引用類型,可直接使用list.add(obj);進(jìn)行添加,但是對(duì)于基本數(shù)據(jù)類型則無(wú)法添加,從而不能使用ArrayList中的許多方法(如排序、刪除等),顯然會(huì)造成許多不便,而使用包裝類則可以很好地避免這種缺陷。
同時(shí),從JDK 1.5開(kāi)始提供了自動(dòng)裝箱和自動(dòng)拆箱的功能,因而目前可以有以下3種初始化包裝類的方法:
方法1:直接傳入相應(yīng)的基本數(shù)據(jù)類型變量或常量,如
int a1=3;Integer a2=new Integer(a1); Float f=new Float(3.14f); Boolean b=new Boolean(true);
方法2:通過(guò)傳入字符串,如
Integer a=new Integer("3");
Float f=new Float("3.14");
Boolean b=new Boolean("true");
值得注意的是使用"True"也可以,如Boolean b=new Boolean(“True”);
方法3:通過(guò)自動(dòng)裝箱功能,如Integer a=3;Float f=3.14f;Boolean b=true;值得注意的是可使用new Float(“3.14”)和new Float(“3.14f”)這樣的語(yǔ)句來(lái)初始化Float類型變量,但是卻不能使用Float f=3.14;來(lái)初始化Float類型變量,因?yàn)?.14是double類型,它只能被自動(dòng)裝箱為Double類型變量。
我們知道,引用類型使用==進(jìn)行比較時(shí),只有當(dāng)二者指向同一個(gè)對(duì)象時(shí),才會(huì)返回true,否則即使值相等也返回false.包裝類也屬于引用類型,所以以下代碼的執(zhí)行結(jié)果為false,
Float f1=new Float(3.14f); Float f2=new Float(3.14f); System.out.println(f1==f2);
但是,下面一段代碼的輸出結(jié)果卻和前面討論的不一樣,這是為什么呢?
import java.util.*;
public class TestWrapperClass
{
public static void main(String[]args)
{
Integer t1=3;
Integer t2=3;
System.out.println(t1==t2);
Integer t3=128;
Integer t4=128;
System.out.println(t3==t4);
Boolean b1=true;
Boolean b2=true;
System.out.println(b1==b2);
}
}
其輸出結(jié)果如下圖所示:

如果按照前面的討論,應(yīng)該都輸出false才對(duì),但這里t1與t2,b1與b2的比較結(jié)果卻為true.這不科學(xué)??!
原來(lái),Java為了獲得更高的執(zhí)行效率,在某些類的設(shè)計(jì)中引入了緩存機(jī)制!
此處的Integer及Boolean類的設(shè)計(jì)即是如此。java.lang.Integer類的部分源代碼如下所示:
static final Integer[]cache=new Integer[-(-128)+127+1];
static{
for(int i=0;i<cache.length;i++)
cache[i]=new Integer[i-128);
}
顯然,系統(tǒng)把-128~127之間的整數(shù)裝箱成Integer實(shí)例,并通過(guò)cache數(shù)組進(jìn)行緩存,所以只要是-128~127之間的Integer類型變量,其指向的對(duì)象都是cache數(shù)組成員,從而只要有兩個(gè)值相同且在-128~127之間的Integer變量,它們指向的對(duì)象就是同一個(gè),故采用==進(jìn)行比較時(shí)也返回true.Boolean的情形與之類似。
實(shí)際上,不只是在Java中,在Android中的一些類也采用了緩存機(jī)制,如Android中的ListView就是一個(gè)典型的例子,在繼承的方法getView中,convertView其實(shí)就是采用了緩存機(jī)制,從而大大節(jié)省了系統(tǒng)資源開(kāi)支,加快了圖形渲染的速度。此處暫且不表,在后面還會(huì)再提到。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言留言交流。
相關(guān)文章
kotlin快速入門(mén)之標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法
學(xué)完了Kotlin的基礎(chǔ)知識(shí),是時(shí)候來(lái)來(lái)學(xué)習(xí) Kotlin的標(biāo)準(zhǔn)函數(shù)和靜態(tài)方法了,下面這篇文章主要給大家介紹了關(guān)于kotlin快速入門(mén)之標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
JavaWeb項(xiàng)目部署到服務(wù)器詳細(xì)步驟詳解
這篇文章主要介紹了JavaWeb項(xiàng)目如何部署到服務(wù)器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
JavaWeb如何實(shí)現(xiàn)限制單個(gè)賬號(hào)多處登錄
這篇文章主要介紹了JavaWeb如何實(shí)現(xiàn)限制單個(gè)賬號(hào)多處登錄問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
springboot?vue項(xiàng)目管理后端實(shí)現(xiàn)接口新增
這篇文章主要為大家介紹了springboot?vue項(xiàng)目管理后端實(shí)現(xiàn)接口新增,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Java圖片處理開(kāi)源框架Thumbnailator
這篇文章主要為大家詳細(xì)介紹了Java圖片處理開(kāi)源框架Thumbnailator的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
MyBatis中關(guān)于resultType和resultMap的區(qū)別介紹
MyBatis中在查詢進(jìn)行select映射的時(shí)候,返回類型可以用resultType,也可以用resultMap,那么MyBatis中關(guān)于resultType和resultMap的區(qū)別是什么呢?下面小編通過(guò)本文給大家解答下2016-09-09
如何使用stream從List對(duì)象中獲取某列數(shù)據(jù)
這篇文章主要介紹了如何使用stream從List對(duì)象中獲取某列數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
java調(diào)用opencv身份證號(hào)識(shí)別詳解
這篇文章主要為大家詳細(xì)介紹了java如何調(diào)用opencv實(shí)現(xiàn)身份證號(hào)的識(shí)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03

