日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

瀏覽:20日期:2022-08-10 10:34:24
目錄一、為什么需要包裝類(lèi)二、裝箱與拆箱三、不簡(jiǎn)單的 Integer.valueOf四、Object 類(lèi)可以接收所有數(shù)據(jù)類(lèi)型五、包裝類(lèi)在集合中的廣泛使用六、數(shù)據(jù)類(lèi)型轉(zhuǎn)換一、為什么需要包裝類(lèi)

在 Java 中,萬(wàn)物皆對(duì)象,所有的操作都要求用對(duì)象的形式進(jìn)行描述。但是 Java 中除了對(duì)象(引用類(lèi)型)還有八大基本類(lèi)型,它們不是對(duì)象。那么,為了把基本類(lèi)型轉(zhuǎn)換成對(duì)象,最簡(jiǎn)單的做法就是將基本類(lèi)型作為一個(gè)類(lèi)的屬性保存起來(lái),也就是把基本數(shù)據(jù)類(lèi)型包裝一下,這也就是包裝類(lèi)的由來(lái)。

這樣,我們先自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的包裝類(lèi),以包裝基本類(lèi)型 int 為例:

// 包裝類(lèi) MyIntpublic class MyInt { private int number; // 基本數(shù)據(jù)類(lèi)型public Int (int number){ // 構(gòu)造函數(shù),傳入基本數(shù)據(jù)類(lèi)型this.number = number; }public int intValue(){ // 取得包裝類(lèi)中的數(shù)據(jù)return this.number; }}

測(cè)試一下這個(gè)包裝類(lèi):

public static void main(String[] args) { MyInt temp = new Int(100); // 100 是基本數(shù)據(jù)類(lèi)型, 將基本數(shù)據(jù)類(lèi)型包裝后成為對(duì)象 int result = temp.intValue(); // 從對(duì)象中取得基本數(shù)據(jù)類(lèi)型 System.out.println(result);}

當(dāng)然,我們自己實(shí)現(xiàn)的這個(gè)包裝類(lèi)非常簡(jiǎn)單,Java 給我們提供了更完善的內(nèi)置包裝類(lèi):

基本類(lèi)型 對(duì)應(yīng)的包裝類(lèi)(位于 java.lang 包中) byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean

前 6 個(gè)類(lèi)派生于公共的超類(lèi) Number,而 Character 和 Boolean 是 Object 的直接子類(lèi)。

來(lái)看看包裝類(lèi)的聲明,以 Integer 為例:

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

被 final 修飾,也就是說(shuō) Java 內(nèi)置的包裝類(lèi)是無(wú)法被繼承的。

二、裝箱與拆箱

OK,現(xiàn)在我們已經(jīng)知道了,存在基本數(shù)據(jù)類(lèi)型與其對(duì)應(yīng)的包裝類(lèi),那么,他們之間互相的轉(zhuǎn)換操作就稱為裝箱與拆箱:

裝箱:將基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換成包裝類(lèi)(每個(gè)包裝類(lèi)的構(gòu)造方法都可以接收各自數(shù)據(jù)類(lèi)型的變量) 拆箱:從包裝類(lèi)之中取出被包裝的基本類(lèi)型數(shù)據(jù)(使用包裝類(lèi)的 xxxValue 方法)

下面以 Integer 為例,我們來(lái)看看 Java 內(nèi)置的包裝類(lèi)是如何進(jìn)行拆裝箱的:

Integer obj = new Integer(10); // 自動(dòng)裝箱int temp = obj.intValue(); // 自動(dòng)拆箱

可以看出,和上面我們自己寫(xiě)的包裝類(lèi)使用方式基本一樣,事實(shí)上,Integer 中的這兩個(gè)方法其底層實(shí)現(xiàn)和我們上述寫(xiě)的代碼也是差不多的。

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

不知道各位發(fā)現(xiàn)沒(méi),value 被聲明為 final 了,也就是說(shuō)一旦構(gòu)造了包裝器,就不允許更改包裝在其中的值。

另外,需要注意的是,這種形式的代碼是 JDK 1.5 以前的!!!JDK 1.5 之后,Java 設(shè)計(jì)者為了方便開(kāi)發(fā)提供了自動(dòng)裝箱與自動(dòng)拆箱的機(jī)制,并且可以直接利用包裝類(lèi)的對(duì)象進(jìn)行數(shù)學(xué)計(jì)算。

還是以 Integer 為例我們來(lái)看看自動(dòng)拆裝箱的過(guò)程:

Integer obj = 10; // 自動(dòng)裝箱. 基本數(shù)據(jù)類(lèi)型 int -> 包裝類(lèi) Integerint temp = obj; // 自動(dòng)拆箱. Integer -> intobj ++; // 直接利用包裝類(lèi)的對(duì)象進(jìn)行數(shù)學(xué)計(jì)算System.out.println(temp * obj);

看見(jiàn)沒(méi)有,基本數(shù)據(jù)類(lèi)型到包裝類(lèi)的轉(zhuǎn)換,不需要像上面一樣使用構(gòu)造函數(shù),直接 = 就完事兒;同樣的,包裝類(lèi)到基本數(shù)據(jù)類(lèi)型的轉(zhuǎn)換,也不需要我們手動(dòng)調(diào)用包裝類(lèi)的 xxxValue 方法了,直接 = 就能完成拆箱。這也是將它們稱之為自動(dòng)的原因。

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

我們來(lái)看看這段代碼反編譯后的文件,底層到底是什么原理:

Integer obj = Integer.valueOf(10);int temp = obj.intValue();

可以看見(jiàn),自動(dòng)裝箱的底層原理是調(diào)用了包裝類(lèi)的 valueOf 方法,而自動(dòng)拆箱的底層調(diào)用了包裝類(lèi)的 intValue() 方法。

三、不簡(jiǎn)單的 Integer.valueOf

我們上面已經(jīng)看過(guò)了用于自動(dòng)拆箱的 intValue 方法的源碼,非常簡(jiǎn)單。接下來(lái)咱來(lái)看看用于自動(dòng)裝箱的 valueOf,其他包裝類(lèi)倒沒(méi)什么好說(shuō)的,不過(guò) Integer 中的這個(gè)方法還是有點(diǎn)東西的:

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

IntegerCache 又是啥,點(diǎn)進(jìn)去看看:

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

IntegerCache 是 Integer 類(lèi)中的靜態(tài)內(nèi)部類(lèi),綜合這兩段代碼,我們大概也能知道,IntegerCache 其實(shí)就是個(gè)緩存,其中定義了一個(gè)緩沖區(qū) cache,用于存儲(chǔ) Integer 類(lèi)型的數(shù)據(jù),緩存區(qū)間是 [-128, 127]。

回到 valueOf 的源碼:它首先會(huì)判斷 int 類(lèi)型的實(shí)參 i 是否在可緩存區(qū)間內(nèi),如果在,就直接從緩存 IntegerCache 中獲取對(duì)應(yīng)的 Integer 對(duì)象;如果不在緩存區(qū)間內(nèi),則會(huì) new 一個(gè)新的 Integer 對(duì)象。

結(jié)合這個(gè)特性,我們來(lái)看一個(gè)題目,兩種類(lèi)似的代碼邏輯,但是卻得到完全相反的結(jié)果。:

public static void main(String args[]) { Integer a1 = 127; Integer a2 = 127; System.out.println(a1 == a2); // true Integer b1 = 128; Integer b2 = 128; System.out.println(b1 == b2); // false}

我們知道,== 擁有兩種應(yīng)用場(chǎng)景:

對(duì)于引用類(lèi)型來(lái)說(shuō),判斷的是內(nèi)存地址是否相等 對(duì)于基本類(lèi)型來(lái)說(shuō),判斷的是值是否相等

從 a1 開(kāi)始看,由于其值在 InterCache 的緩存區(qū)間內(nèi),所以這個(gè) Integer 對(duì)象會(huì)被存入緩存。而在創(chuàng)建 a2 的時(shí)候,由于其值和 a1 相等,所以直接從緩存中取出值為 127 的 Integer 對(duì)象給 a2 使用,也就是說(shuō),a1 和 a2 這兩個(gè) Integer 的對(duì)象引用都指向同一個(gè)地址。

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

對(duì)于 b1 和 b2 來(lái)說(shuō),由于 128 不在 IntegerCache 的緩存區(qū)間內(nèi),那就只能自己老老實(shí)實(shí)開(kāi)辟空間了,所以 b1 和 b2 指向不同的內(nèi)存地址。

很顯然,由于 InterCache 緩存機(jī)制的存在,可能會(huì)讓我們?cè)诰幊痰臅r(shí)候出現(xiàn)困惑,因此最好使用 .equals 方法來(lái)比較 Integer 值是否相等。Integer 重寫(xiě)了 .equals 方法:

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

當(dāng)然,其他包裝類(lèi)雖然沒(méi)有緩存機(jī)制,但是也都重載了 .equals 方法,用于根據(jù)值來(lái)判斷是否相等。因此,得出結(jié)論,使用 equals 方法來(lái)比較兩個(gè)包裝類(lèi)對(duì)象的值。

四、Object 類(lèi)可以接收所有數(shù)據(jù)類(lèi)型

綜上,有了自動(dòng)拆裝箱機(jī)制,基本數(shù)據(jù)類(lèi)型可以自動(dòng)的被轉(zhuǎn)為包裝類(lèi),而 Object 是所有類(lèi)的父類(lèi),也就是說(shuō),Object 可以接收所有的數(shù)據(jù)類(lèi)型了(引用類(lèi)型、基本類(lèi)型)!!!

不信你可以試試,直接用 Object 類(lèi)接收一個(gè)基本數(shù)據(jù)類(lèi)型 int,完全是可以的。

Object obj = 10;int temp = (Integer) obj;

解釋一下上面這段代碼發(fā)生了什么,下面這張圖很重要,大家仔細(xì)看:

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

五、包裝類(lèi)在集合中的廣泛使用

其實(shí)包裝類(lèi)最常見(jiàn)的使用就是在集合中,因?yàn)榧喜辉试S存儲(chǔ)基本類(lèi)型的數(shù)據(jù),只能存儲(chǔ)引用類(lèi)型的數(shù)據(jù)。那如果我們想要存儲(chǔ) 1、2、3 這樣的基本類(lèi)型數(shù)據(jù)怎么辦?舉個(gè)例子,我們可以如下聲明一個(gè) Integer 對(duì)象的數(shù)組列表:

ArrayList<Integer> list = new ArrayList<>();

往這個(gè)列表中添加 int 型數(shù)據(jù):

list.add(3);

上面這個(gè)調(diào)用在底層將會(huì)發(fā)生自動(dòng)裝箱操作:

list.add (Integer.valueOf(3));

基本數(shù)據(jù)類(lèi)型 int 會(huì)被轉(zhuǎn)換成 Integer 對(duì)象存入集合中。

我們?cè)賮?lái)從這個(gè)集合中根據(jù)某個(gè)下標(biāo) i 獲取對(duì)應(yīng)的 Integer 對(duì)象,并用基本數(shù)據(jù)類(lèi)型 int 接收:

int n = list.get(i);

上面這個(gè)調(diào)用在底層將會(huì)發(fā)生自動(dòng)拆箱操作:

int n = list.get(i).intValue();六、數(shù)據(jù)類(lèi)型轉(zhuǎn)換

另外,除了在集合中的廣泛應(yīng)用,包裝類(lèi)還包含一個(gè)重要功能,那就是提供將String型數(shù)據(jù)變?yōu)榛緮?shù)據(jù)類(lèi)型的方法,使用幾個(gè)代表的類(lèi)做說(shuō)明:

Integer:

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

Double:

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

Boolean:

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

這些方法均被 static 標(biāo)識(shí),也就是說(shuō)它們被各自對(duì)應(yīng)的所有對(duì)象共同維護(hù),直接通過(guò)類(lèi)名訪問(wèn)該方法。舉個(gè)例子:

String str = '10';int temp = Integer.parseInt(str);// String -> intSystem.out.println(temp * 2); // 20

需要特別注意的是:Character 類(lèi)里面并不存在字符串變?yōu)樽址姆椒ǎ驗(yàn)?String 類(lèi)中已經(jīng)有一個(gè) charAt()的方法可以根據(jù)索引取出字符內(nèi)容。

淺析Java中為什么要設(shè)計(jì)包裝類(lèi)

以上就是淺析Java中為什么要設(shè)計(jì)包裝類(lèi)的詳細(xì)內(nèi)容,更多關(guān)于Java 設(shè)計(jì)包裝類(lèi)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
四季av一区二区凹凸精品| 欧美日韩中文一区二区| 久久久久99| 久久精品一区二区国产| 午夜天堂精品久久久久| 久久av在线| 欧美激情另类| 国产精品magnet| 91成人在线精品视频| 伊人成人在线视频| 日韩.com| 国产一区二区三区久久| 国产精品日本一区二区不卡视频 | 日本亚洲不卡| 国产二区精品| 欧美日韩激情| 亚洲成人三区| 在线视频观看日韩| 日韩精品一卡| 久久精品青草| 久久国产毛片| 欧美国产91| 激情婷婷欧美| 红桃视频国产一区| 久久高清一区| 亚洲色图综合| 亚洲三级精品| 日韩影片在线观看| 亚洲毛片视频| 国产午夜久久| 国产精品免费看| 蜜臀av性久久久久蜜臀aⅴ流畅| 黄页网站一区| 亚洲一区二区免费在线观看| 免费一级片91| 91在线成人| 国产精品一线天粉嫩av| 欧美黑人巨大videos精品| 国产亚洲精aa在线看| 国产精品22p| 国产精品麻豆久久| 欧美freesex黑人又粗又大| 在线一区视频观看| 亚洲深夜av| 丝袜美腿一区二区三区| 日韩一二三区在线观看| 日韩av中文字幕一区二区| 日本精品另类| 欧美激情网址| 日韩欧美一区二区三区在线观看| 欧美日韩一二三四| 免费久久99精品国产| 日韩精品社区| 国产成人免费| 亚洲精华国产欧美| 日韩一区中文| 黄色精品视频| 婷婷综合在线| 奇米狠狠一区二区三区| 国产一卡不卡| 精品视频99| 久久91导航| 精品欧美一区二区三区在线观看| 香蕉精品视频在线观看| 日韩精品免费一区二区三区| 亚洲神马久久| 久久一二三区| 免费欧美一区| 欧美日韩xxxx| 日韩欧美午夜| 免费成人在线视频观看| 麻豆国产精品| 精品一区欧美| 久久国产三级| 国产盗摄——sm在线视频| 在线精品视频在线观看高清| 国产精品流白浆在线观看| 国产黄大片在线观看| 亚洲一区二区动漫| 欧美亚洲二区| 亚洲一本视频| 国产精品久久久久久久久久白浆 | 欧美sss在线视频| 日韩av一区二区在线影视| 日本不良网站在线观看| 亚洲人成精品久久久| 欧美a一区二区| 欧美日韩一二| 国产美女久久| 99热精品在线| 欧美激情视频一区二区三区免费 | 视频在线观看一区二区三区| 国产精品v日韩精品v欧美精品网站 | 欧美日韩尤物久久| 日韩精品视频一区二区三区| 日韩av在线播放网址| 免费在线观看成人| 精品久久亚洲| 日韩综合一区二区| 亚洲一级特黄| 久久亚州av| 最新国产精品| 欧洲亚洲一区二区三区| 老牛国内精品亚洲成av人片| 日韩在线第七页| 日韩福利在线观看| 黑丝美女一区二区| 久久亚州av| 综合在线一区| 国产一区视频在线观看免费| 麻豆国产一区| 亚洲精品亚洲人成在线观看| 国产精品mm| 中文字幕亚洲在线观看| 四虎国产精品免费观看| 国产午夜精品一区二区三区欧美 | 91成人精品| 国产精品第一国产精品| 亚洲区欧美区| 国产亚洲网站| 97人人精品| 日本不卡视频一二三区| 久久久久久网| 久久国际精品| 视频一区二区中文字幕| 久久久精品五月天| 高清一区二区| 精品中文字幕一区二区三区| 日韩精品免费一区二区夜夜嗨| 欧美日韩日本国产亚洲在线 | 欧美日韩xxxx| 蜜臀av一区二区在线免费观看| 国产精品99免费看| 精品亚洲a∨| 国产精品久久久久9999高清| a天堂资源在线| 国产精品久久观看| 国产在线观看91一区二区三区| 国产精品超碰| 国产精品视频3p| 日韩av影院| 日韩国产91| 日韩国产一区二| 18国产精品| 91精品一区| 国产乱码精品| 国内一区二区三区| 国产中文在线播放| 精品视频在线一区二区在线| 国产精品99久久久久久董美香| 欧美日本不卡| 国产乱码精品一区二区亚洲| 国产伦精品一区二区三区视频 | 久久婷婷久久| 久久久久国产| 亚洲一级黄色| 亚洲免费激情| 一本综合精品| 午夜视频一区二区在线观看| 亚洲精品一二三**| 只有精品亚洲| 青青青国产精品| 国产精品一区2区3区| 国产伦精品一区二区三区千人斩| 国产伦精品一区二区三区千人斩| 久久成人福利| 91日韩欧美| 久久理论电影| 亚洲欧美日韩国产| 视频一区在线播放| 亚洲丝袜啪啪| 国产精品magnet| 国产96在线亚洲| 久久精品青草| 国产精品女主播一区二区三区| 好看的亚洲午夜视频在线| 在线国产一区| 蜜桃av一区二区在线观看| 日本va欧美va欧美va精品| 国产精品视频一区二区三区四蜜臂 | 在线免费观看亚洲| 欧美一区=区三区| 精品视频自拍| 国产一区观看| 视频一区中文字幕| 国产日韩1区| 成人日韩在线| 免费人成在线不卡| 日韩av午夜在线观看| 国产美女高潮在线| 99在线精品免费视频九九视 | 色网在线免费观看| 在线国产一区二区| 国产精品亚洲综合久久| av中文字幕在线观看第一页| 婷婷丁香综合| 欧美私人啪啪vps| 成人va天堂| 黄色亚洲免费| 国产精品最新自拍|