Java新特性之Java5的那些事兒-裝箱與拆箱

特性列表

  • 自動化拆箱與裝箱

  • 枚舉

  • 泛型

  • 增強for循環(huán)

  • 可變參數(shù)

  • 注解

  • 靜態(tài)導入

  • 線程池

  • Generics 類

  • 元數(shù)據(jù)

  • 協(xié)變返回類型

拆箱與裝箱

? java語言從設計之初就標識其為面向對象的一門語言,并提供了4類八種基本數(shù)據(jù)類型趴樱,在設計時每種基本類型均對應了相應的包裝類型:

int Integer
byte Byte
short Short
long Long
float Float
double Double
char Character
boolean Boolean

什么是拆箱,什么又是裝箱?

裝箱與拆箱.jpg

? 拆箱與裝箱招驴,這兩個名稱很容易讓人聯(lián)想到工廠車間中流水線上包裝產(chǎn)品和打開產(chǎn)品時的兩個常見操作坠非,舉個栗子:我們每個開發(fā)人員用到的筆記本電腦,背后需要有對應的生產(chǎn)廠家來負責生產(chǎn)組裝肺樟,當電腦生產(chǎn)組裝完畢不是直接拿到了市場上就行銷售,此時會給該電腦打上標簽,型號并進行打包便于后續(xù)運輸和銷售乘综,而對于購買用戶來說,我們在網(wǎng)上下過單后拿到的也不是一個裸機套硼,我們拿到的是被廠商包裝過得一臺電腦產(chǎn)品卡辰,此時,激動的你會小手顫抖的小心打開電腦包裝盒,里面有廠商給你打包好的電腦九妈,電源反砌,說明書等,說到這里,相信大家對于裝箱與拆箱過程有整體了解。

? 為什么需要自動裝箱與拆箱?
Java早年設計的一個缺陷式廷,基本數(shù)據(jù)類型不是對象啤它,自然不是Object的子類,
需要裝箱才能把數(shù)據(jù)類型變成一個類,那就可以把裝箱過后的基本數(shù)據(jù)類型當做一個對象,就可以調用object子類的接口。而且基本數(shù)據(jù)類型是不可以作為形參使用的同衣,裝箱后就可以滿足使用了。

? Jdk1.5 引入了基本類型自動化的裝箱與拆箱新特性壶运,這兩個操作不需要開發(fā)人員在負責代碼的處理耐齐,而是交給編譯器來自動化實現(xiàn),想想是不是很美蒋情?

? Jdk 對于裝箱與拆箱的定義描述:

? 裝箱:程序在運行時自動將基本數(shù)據(jù)類型轉換為包裝類型埠况;

? 拆箱:程序在運行時自動將包裝類型轉換為基本數(shù)據(jù)類型。

代碼演示

Java5之前拆箱與裝箱示例代碼((這里以Integer類型為例棵癣,其他類型同樣適用辕翰,讀者自行驗證)):

 /**
     * Java5之前拆箱與裝箱代碼示例
     */
    public static void test_boxing_unboxing_4(){
        /**
         * Java5 之前得到一個2048的包裝對象
         *   需要通過手動方式借助帶參構造器 構造2048 Integer 對象
         */
        Integer i=new Integer(2048);
        System.out.println(i);

        /**
         * Java5 之前由包裝類型得到一個2048的基本類型
         *   通過調用Integer包裝對象intValue方法獲取整數(shù)2048
         */
        int h=i.intValue();
        System.out.println(h);
    }

Java5之后拆箱與裝箱示例代碼:

public static void main(String[] args) {
    /**
     * 自動化裝箱:程序在運行時自動將基本數(shù)據(jù)類型轉換為包裝類型;
     * Java5開始提供了自動裝箱功能
     *  比如我要定義一個2048的整型對象 從Java5 開始就可以這樣來編寫你的代碼
     *  這個過程程序在運行中會自動根據(jù)我們提供的2048數(shù)字創(chuàng)建一個Integer對象
     */
    Integer i=2048;// 裝箱
    System.out.println(i);

    /**
     *自動化拆箱:程序在運行時自動將包裝類型轉換為基本數(shù)據(jù)類型狈谊。
     * Java5開始提供了自動裝箱功能
     * 比如我要定義一個1024的整型對象l 此時程序在運行時就會產(chǎn)生裝箱操作
     * 后續(xù)定義變量x 值為l 此時Integer 類型的l變量會將自已引用的1024數(shù)值賦給x 這個過程就是拆箱
     */
    Integer l=1024;// 裝箱
    int x=l;// 拆箱
    System.out.println(x);
}

? 從以上代碼可以看出 Java5 之后對于基本數(shù)據(jù)類型的裝箱與拆箱的代碼變得相當簡潔喜命,大大簡化了我們平時開發(fā)代碼量。

裝箱與拆箱實現(xiàn)

在項目編譯目錄下執(zhí)行 通過反編譯命令 javap -c河劝,編譯對應class 文件 如下圖:

反編譯分析.png

可以看得到:Java5 之后實現(xiàn)自動化裝箱 內部實際上執(zhí)行的是valueof 方法 壁榕,而自動化拆箱內部執(zhí)行的為intValue方法。

自動裝箱與拆箱面試常見“坑”

  • Integer 比較問題
    public  static void test_autoboxing_unboxing(){
        Integer b1 = 66;
        Integer b2 = 66;
        Integer b3 = 201;
        Integer b4 = 201;
        System.out.println(b1 == b2);// true or false?
        System.out.println(b3 == b4);// true or false?
    }

這里第一個輸出為true,而第二個輸出為false赎瞎。

1553155645479.png

答案可以從源碼分析得到:當數(shù)字在-127 ~128 之間時返回指向IntegerCache.cache中已經(jīng)存在的對象的引用牌里;否則創(chuàng)建一個新的Integer對象。

  • Double 比較問題
public  static  void test_autoboxing_unboxing02(){
        Double b1 = 66.0;
        Double b2 = 66.0;
        Double b3 = 201.0;
        Double b4 = 201.0;
        System.out.println(b1==b2);
        System.out.println(b3==b4);
    }

這里兩次輸出均為false务甥。

1553156176210.png

答案可以從源碼分析得到每次得到的double 對象均是一個新創(chuàng)建后的對象牡辽,變量的地址是不一樣的,那為什么Double類的valueOf方法會采用與Integer類的valueOf方法不同的實現(xiàn)?很簡單:在某個范圍內的整型數(shù)值的個數(shù)是有限的敞临,而浮點數(shù)卻不是
注意,Integer催享、Short、Byte哟绊、Character、Long這幾個類的valueOf方法的實現(xiàn)是類似的。Double票髓、Float的valueOf方法的實現(xiàn)是類似的攀涵。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洽沟,隨后出現(xiàn)的幾起案子以故,更是在濱河造成了極大的恐慌,老刑警劉巖裆操,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怒详,死亡現(xiàn)場離奇詭異,居然都是意外死亡踪区,警方通過查閱死者的電腦和手機昆烁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缎岗,“玉大人静尼,你說我怎么就攤上這事〈矗” “怎么了鼠渺?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長眷细。 經(jīng)常有香客問我拦盹,道長,這世上最難降的妖魔是什么溪椎? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任普舆,我火速辦了婚禮,結果婚禮上池磁,老公的妹妹穿的比我還像新娘奔害。我一直安慰自己,他們只是感情好地熄,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布华临。 她就那樣靜靜地躺著,像睡著了一般端考。 火紅的嫁衣襯著肌膚如雪雅潭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天却特,我揣著相機與錄音扶供,去河邊找鬼。 笑死裂明,一個胖子當著我的面吹牛椿浓,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼扳碍,長吁一口氣:“原來是場噩夢啊……” “哼提岔!你這毒婦竟也來了?” 一聲冷哼從身側響起笋敞,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤碱蒙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后夯巷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赛惩,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年趁餐,在試婚紗的時候發(fā)現(xiàn)自己被綠了喷兼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡澎怒,死狀恐怖褒搔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情喷面,我是刑警寧澤星瘾,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站惧辈,受9級特大地震影響琳状,放射性物質發(fā)生泄漏。R本人自食惡果不足惜盒齿,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一念逞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧边翁,春花似錦翎承、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啊胶,卻和暖如春甸各,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焰坪。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工趣倾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人某饰。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓儒恋,卻偏偏與公主長得像善绎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诫尽,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351