成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

淺析Java中為什么要設計包裝類

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

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

這樣,我們先自己實現一個簡單的包裝類,以包裝基本類型 int 為例:

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

測試一下這個包裝類:

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

當然,我們自己實現的這個包裝類非常簡單,Java 給我們提供了更完善的內置包裝類:

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

前 6 個類派生于公共的超類 Number,而 Character 和 Boolean 是 Object 的直接子類。

來看看包裝類的聲明,以 Integer 為例:

淺析Java中為什么要設計包裝類

被 final 修飾,也就是說 Java 內置的包裝類是無法被繼承的。

二、裝箱與拆箱

OK,現在我們已經知道了,存在基本數據類型與其對應的包裝類,那么,他們之間互相的轉換操作就稱為裝箱與拆箱:

裝箱:將基本數據類型轉換成包裝類(每個包裝類的構造方法都可以接收各自數據類型的變量) 拆箱:從包裝類之中取出被包裝的基本類型數據(使用包裝類的 xxxValue 方法)

下面以 Integer 為例,我們來看看 Java 內置的包裝類是如何進行拆裝箱的:

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

可以看出,和上面我們自己寫的包裝類使用方式基本一樣,事實上,Integer 中的這兩個方法其底層實現和我們上述寫的代碼也是差不多的。

淺析Java中為什么要設計包裝類

不知道各位發現沒,value 被聲明為 final 了,也就是說一旦構造了包裝器,就不允許更改包裝在其中的值。

另外,需要注意的是,這種形式的代碼是 JDK 1.5 以前的!!!JDK 1.5 之后,Java 設計者為了方便開發提供了自動裝箱與自動拆箱的機制,并且可以直接利用包裝類的對象進行數學計算。

還是以 Integer 為例我們來看看自動拆裝箱的過程:

Integer obj = 10; // 自動裝箱. 基本數據類型 int -> 包裝類 Integerint temp = obj; // 自動拆箱. Integer -> intobj ++; // 直接利用包裝類的對象進行數學計算System.out.println(temp * obj);

看見沒有,基本數據類型到包裝類的轉換,不需要像上面一樣使用構造函數,直接 = 就完事兒;同樣的,包裝類到基本數據類型的轉換,也不需要我們手動調用包裝類的 xxxValue 方法了,直接 = 就能完成拆箱。這也是將它們稱之為自動的原因。

淺析Java中為什么要設計包裝類

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

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

可以看見,自動裝箱的底層原理是調用了包裝類的 valueOf 方法,而自動拆箱的底層調用了包裝類的 intValue() 方法。

三、不簡單的 Integer.valueOf

我們上面已經看過了用于自動拆箱的 intValue 方法的源碼,非常簡單。接下來咱來看看用于自動裝箱的 valueOf,其他包裝類倒沒什么好說的,不過 Integer 中的這個方法還是有點東西的:

淺析Java中為什么要設計包裝類

IntegerCache 又是啥,點進去看看:

淺析Java中為什么要設計包裝類

IntegerCache 是 Integer 類中的靜態內部類,綜合這兩段代碼,我們大概也能知道,IntegerCache 其實就是個緩存,其中定義了一個緩沖區 cache,用于存儲 Integer 類型的數據,緩存區間是 [-128, 127]。

回到 valueOf 的源碼:它首先會判斷 int 類型的實參 i 是否在可緩存區間內,如果在,就直接從緩存 IntegerCache 中獲取對應的 Integer 對象;如果不在緩存區間內,則會 new 一個新的 Integer 對象。

結合這個特性,我們來看一個題目,兩種類似的代碼邏輯,但是卻得到完全相反的結果。:

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}

我們知道,== 擁有兩種應用場景:

對于引用類型來說,判斷的是內存地址是否相等 對于基本類型來說,判斷的是值是否相等

從 a1 開始看,由于其值在 InterCache 的緩存區間內,所以這個 Integer 對象會被存入緩存。而在創建 a2 的時候,由于其值和 a1 相等,所以直接從緩存中取出值為 127 的 Integer 對象給 a2 使用,也就是說,a1 和 a2 這兩個 Integer 的對象引用都指向同一個地址。

淺析Java中為什么要設計包裝類

對于 b1 和 b2 來說,由于 128 不在 IntegerCache 的緩存區間內,那就只能自己老老實實開辟空間了,所以 b1 和 b2 指向不同的內存地址。

很顯然,由于 InterCache 緩存機制的存在,可能會讓我們在編程的時候出現困惑,因此最好使用 .equals 方法來比較 Integer 值是否相等。Integer 重寫了 .equals 方法:

淺析Java中為什么要設計包裝類

當然,其他包裝類雖然沒有緩存機制,但是也都重載了 .equals 方法,用于根據值來判斷是否相等。因此,得出結論,使用 equals 方法來比較兩個包裝類對象的值。

四、Object 類可以接收所有數據類型

綜上,有了自動拆裝箱機制,基本數據類型可以自動的被轉為包裝類,而 Object 是所有類的父類,也就是說,Object 可以接收所有的數據類型了(引用類型、基本類型)!!!

不信你可以試試,直接用 Object 類接收一個基本數據類型 int,完全是可以的。

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

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

淺析Java中為什么要設計包裝類

五、包裝類在集合中的廣泛使用

其實包裝類最常見的使用就是在集合中,因為集合不允許存儲基本類型的數據,只能存儲引用類型的數據。那如果我們想要存儲 1、2、3 這樣的基本類型數據怎么辦?舉個例子,我們可以如下聲明一個 Integer 對象的數組列表:

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

往這個列表中添加 int 型數據:

list.add(3);

上面這個調用在底層將會發生自動裝箱操作:

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

基本數據類型 int 會被轉換成 Integer 對象存入集合中。

我們再來從這個集合中根據某個下標 i 獲取對應的 Integer 對象,并用基本數據類型 int 接收:

int n = list.get(i);

上面這個調用在底層將會發生自動拆箱操作:

int n = list.get(i).intValue();六、數據類型轉換

另外,除了在集合中的廣泛應用,包裝類還包含一個重要功能,那就是提供將String型數據變為基本數據類型的方法,使用幾個代表的類做說明:

Integer:

淺析Java中為什么要設計包裝類

Double:

淺析Java中為什么要設計包裝類

Boolean:

淺析Java中為什么要設計包裝類

這些方法均被 static 標識,也就是說它們被各自對應的所有對象共同維護,直接通過類名訪問該方法。舉個例子:

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

需要特別注意的是:Character 類里面并不存在字符串變為字符的方法,因為 String 類中已經有一個 charAt()的方法可以根據索引取出字符內容。

淺析Java中為什么要設計包裝類

以上就是淺析Java中為什么要設計包裝類的詳細內容,更多關于Java 設計包裝類的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品mv在线观看| 欧美日韩91| 91香蕉视频黄| 欧美天堂一区二区三区| 色一区在线观看| 欧美性猛交xxxxxxxx| 在线观看国产91| 91黄色在线观看| 欧美揉bbbbb揉bbbbb| 欧美三级电影在线看| 欧美视频在线观看一区| 欧美日本乱大交xxxxx| 亚洲素人一区二区| 国产精品伊人色| 欧美日韩成人一区| 蜜臀99久久精品久久久久久软件| 欧美日一区二区在线观看| 国产一区视频在线观看免费| 亚洲国产日韩欧美| 久久国产欧美精品| 欧美精品一级二级三级| 日韩精品一区二| 中文字幕一区二区三区蜜月| 亚洲综合一区二区三区| 日韩福利视频网| 成人性生交大片免费看中文网站| 91一区二区在线观看| 在线播放不卡| 奇米精品一区二区三区四区| 噜噜爱69成人精品| 一区二区三区免费| 欧美色123| 亚洲国产电影在线观看| 狠狠色综合网| 亚洲三级免费观看| 亚洲美女黄色| 一区二区在线看| 亚洲永久免费| 亚洲成精国产精品女| 久久精品人人| 麻豆免费精品视频| 欧美狂野另类xxxxoooo| 国产精品2024| 精品久久国产字幕高潮| 99免费精品在线| 国产精品视频九色porn| 欧美一区激情| 欧美激情一区二区三区不卡| 国产综合欧美在线看| 综合电影一区二区三区 | 亚洲欧洲www| 欧美三级一区二区| 国产成人午夜精品5599| 久久久久国产精品免费免费搜索| 91女厕偷拍女厕偷拍高清| 国产精品人人做人人爽人人添| 在线欧美三区| 亚洲一区二区中文在线| 国产无一区二区| 亚洲大片一区二区三区| av亚洲精华国产精华精| 欧美性感一类影片在线播放| 中文字幕日韩欧美一区二区三区| 国产一区二区精品在线观看| 国产精品日本| 国产午夜亚洲精品理论片色戒| 久久99日本精品| 亚洲综合一区二区三区| 久久九九免费| 国产一区激情在线| 欧美99在线视频观看| 午夜视频精品| 精品国内二区三区| 美国三级日本三级久久99| 欧美色图首页| 日韩精品一区二区三区蜜臀| 丝袜美腿亚洲色图| 国产美女在线精品免费观看| 国产精品久久网站| av在线一区二区| 欧美电影免费观看高清完整版在| 久久99这里只有精品| 91久久线看在观草草青青| 欧美绝品在线观看成人午夜影视| 日本视频中文字幕一区二区三区| 日韩欧美在线网站| 在线精品亚洲| 激情综合五月天| 精品日本一线二线三线不卡| 亚洲性色视频| 亚欧色一区w666天堂| 欧美88av| 亚洲精品一区二区三区在线观看| 国产精品一级二级三级| 欧美久久久久久久久中文字幕| 国内精品嫩模私拍在线| 制服.丝袜.亚洲.另类.中文 | 欧美一级艳片视频免费观看| 日韩成人一级大片| 美女爽到呻吟久久久久| 偷窥少妇高潮呻吟av久久免费| 精品国产免费人成在线观看| 很黄很黄激情成人| 蜜桃视频第一区免费观看| 久久综合九色欧美综合狠狠 | 6080午夜不卡| 成熟亚洲日本毛茸茸凸凹| 日韩一区二区精品| 欧美亚洲免费| 日韩精品高清不卡| 91精品国产91久久综合桃花| 成人免费av资源| 国产欧美一区二区三区在线看蜜臀 | 国产欧美日韩综合| 精品白丝av| 亚洲va欧美va人人爽午夜| 久久蜜桃精品| 国产一区二区免费视频| 精品成人在线观看| 狠狠色丁香久久综合频道| 国产一区日韩二区欧美三区| 精品日韩一区二区三区免费视频| 91丝袜美腿高跟国产极品老师| 中文一区在线播放| 一区二区三区四区五区视频| 一区二区免费看| 久久久久欧美| 国产乱码精品1区2区3区| 欧美另类亚洲| 91在线观看一区二区| 日本在线不卡视频一二三区| 中文字幕制服丝袜一区二区三区| 欧美日本一区二区在线观看| 又紧又大又爽精品一区二区| 美女国产精品| 92精品国产成人观看免费| 国产精品久久网站| 久久综合九九| 高清成人在线观看| 中文字幕的久久| 性色一区二区三区| 国产精品1区2区| 亚洲久本草在线中文字幕| 欧美日韩二区三区| 亚洲大片av| 韩国av一区二区| 亚洲精品高清在线观看| 亚洲青色在线| 久久精品国产在热久久| 一区二区三区美女| 国产精品美女久久久久久久久久久 | 亚洲成人1区2区| 精品三级在线看| 每日更新成人在线视频| 欧美二区视频| 美女网站色91| 椎名由奈av一区二区三区| 在线视频欧美区| 蜜臀久久久99精品久久久久久| 精品国产免费一区二区三区四区| 91精品久久久久久久99蜜桃| 欧美日韩一区不卡| 在线观看欧美黄色| 久久国产66| 亚洲手机在线| 91视频91自| 亚洲妇熟xx妇色黄| 校园激情久久| 欧美日韩岛国| a级精品国产片在线观看| 水蜜桃久久夜色精品一区的特点| 国内外精品视频| 香蕉av福利精品导航| 国产精品视频麻豆| www久久精品| 在线91免费看| 欧美亚洲一区二区在线观看| 国产一区二区三区奇米久涩| 欧美精品二区| 粉嫩嫩av羞羞动漫久久久| 久久99精品国产麻豆婷婷洗澡| 国产蜜臀97一区二区三区| 欧美二区在线观看| 在线观看精品一区| 久久最新视频| 一本一道久久a久久精品| 国产欧美午夜| 亚洲精品久久| 亚洲人人精品| 亚洲人www| 亚洲日本激情| 亚洲欧洲一二三| 91久久中文| 亚洲毛片播放| 夜夜嗨网站十八久久| 亚洲高清毛片| 韩日视频一区| 亚洲美女网站| 国产伦精品一区二区三区| a91a精品视频在线观看|