049:基本類型優(yōu)先于包裝類型

基本類型和包裝類型之間有三個(gè)主要區(qū)別:

  • 1、基本類型只有值,而兩個(gè)包裝類型可以具有相同的值和不同的同一性(值相同,但是==false)

  • 2、基本類型只有功能完備的值,而每個(gè)包裝類型除了它對(duì)應(yīng)基本類型的所有功能值以外,還有個(gè)非功能值:null。

  • 3、基本類型通常比包裝類型更節(jié)省時(shí)間和空間。

案例

(一)

package demo.one;

import java.util.Comparator;

/**
 * 存在問題的實(shí)現(xiàn)方式
 * 
 * @author TongWei.Chen
 * @date 2017年3月21日21:08:11
 */
public class BadDemoOne {
    //比較器,返回的數(shù)值到底是正數(shù)負(fù)數(shù)還是0,取決于他的第一個(gè)參數(shù)是小于等于還是大于第二個(gè)參數(shù)
    static Comparator<Integer> naturalOrder = new Comparator<Integer>() {
        public int compare(Integer first, Integer second) {
            return first < second ? -1 : (first == second ? 0 : 1);
        }
    };
    
    public static void main(String[] args) {
        System.out.println(naturalOrder.compare(new Integer(66),
                new Integer(66))); //1
    }
}

從結(jié)果可以看出,輸出的居然是1,而不是0,原因在于first和second兩個(gè)參數(shù)表示同一個(gè)int值,但是是不同的Integer實(shí)例。所以這個(gè)比操作會(huì)返回false,對(duì)包裝類用==去比較幾乎總是錯(cuò)的,建議包裝類用equals去比較。

(二)解決上述問題

package demo.one;

import java.util.Comparator;

/**
 * 解決BadDemoOne方式
 * 
 * @author TongWei.Chen
 * @date 2017年3月21日21:08:11
 */
public class GoodDemoOne {
    //比較器,返回的數(shù)值到底是正數(shù)負(fù)數(shù)還是0,取決于他的第一個(gè)參數(shù)是小于等于還是大于第二個(gè)參數(shù)
    static Comparator<Integer> naturalOrder = new Comparator<Integer>() {
        public int compare(Integer first, Integer second) {
            int f = first;
            int s = second;
            return f < s ? -1 : (f == s ? 0 : 1);
        }
    };
    
    public static void main(String[] args) {
        System.out.println(naturalOrder.compare(new Integer(66),
                new Integer(66))); //0
    }
}

強(qiáng)制在使用時(shí)讓他拆箱成基本類型,結(jié)果輸出正常,返回0。

(三)

package demo.two;

/**
 * 存在NullPointerException
 * 
 * @author TongWei.Chen
 * @date 2017年3月21日21:26:28
 */
public class Unbelievable {
    
    //包裝類型默認(rèn)null
    static Integer i;
    
    public static void main(String[] args) {
        if(i == 42) {
            System.out.println("我錯(cuò)了嘛?");
        }
    }
}

拋出NullPointerException,因?yàn)榘b類型默認(rèn)null

(四)解決上述問題

package demo.two;

/**
 * 解決NullPointerException
 * 
 * @author TongWei.Chen
 * @date 2017年3月21日21:26:28
 */
public class Believable {
    
    //int基本類型默認(rèn)0
    static int i;
    
    public static void main(String[] args) {
        if(i == 42) {
            System.out.println("我錯(cuò)了嘛?");
        }
    }
}

不會(huì)拋出任何異常

包裝類型做運(yùn)算操作比基本類型慢幾十倍,參考我的另外一篇文章http://www.itdecent.cn/p/54e5fa72d5b5

問:那么我們什么時(shí)候用包裝類型呢?
答:有三個(gè)合理的用處

  • 1、作為集合中的元素、鍵和值。
  • 2、在參數(shù)化類型中,必須使用包裝類。
  • 3、進(jìn)行反射的方法調(diào)用時(shí),必須使用裝箱基本類型。

總之:當(dāng)可以選擇的時(shí)候,基本類型要優(yōu)于包裝類型?;绢愋透啙嵏焖?。

若有興趣,歡迎來加入群,【Java初學(xué)者學(xué)習(xí)交流群】:458430385,此群有Java開發(fā)人員、UI設(shè)計(jì)人員和前端工程師。有問必答,共同探討學(xué)習(xí),一起進(jìn)步!
歡迎關(guān)注我的微信公眾號(hào)【Java碼農(nóng)社區(qū)】,會(huì)定時(shí)推送各種干貨:


qrcode_for_gh_577b64e73701_258.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,688評(píng)論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評(píng)論 25 709
  • 狂風(fēng)呼嘯雨欲來, 吹散枯枝并流云。 觀得百花盡敝落, 惟剩千草展姿顏。
    瘋不語AOA閱讀 192評(píng)論 0 0
  • 窮人有窮的原因,富人也有富的原因。窮人只會(huì)埋頭苦干,而富人會(huì)利用一切周邊的環(huán)境為自己所用,重要一點(diǎn)是懂得講故事給別...
    麥風(fēng)玄閱讀 1,240評(píng)論 2 3

友情鏈接更多精彩內(nèi)容