工作紀實_05-數字的比較

工作中,總是遇到代碼檢測工具提示我,某些數字之間的比較需要將 == 替換爲equal,每次都是麻木的直接優化,但是並沒有仔細的去思考,爲什麼提示我有這個問題,我把代碼貼一下:

public enum DBOptTypeEnum {

    INSERT(1, "插入記錄"),

    UPDATE(2, "修改記錄"),

    DELETE(3, "刪除記錄");

    private Integer code;
    private String desc;

    public Integer getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }

    DBOptTypeEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public static DBOptTypeEnum getByCode(Integer code) {
        DBOptTypeEnum[] enums = DBOptTypeEnum.values();
        for (DBOptTypeEnum e : enums) {
        	// 這裏就是sonar檢測出來的壞味道,也就是可能出現異常的地方
            if (e.getCode().equals(code)) {
                return e;
            }
        }
        return null;
    }
}

從代碼中我們可以看到,e.getCode == code 是不推薦些的,爲什麼?
這個問題老生常談,也是面試經常問的這種題目,可能題會做,也能解釋給面試官,由於基礎數值類的cache機制,導致(-128<=num<=127)以外的數字區間,需要new對象導致,說起來我也可以頭頭是道:

Integer a = 1000, b = 1000;
System.out.println(a == b);//false
Integer c = 100, d = 100;
System.out.println(c == d);//true

Integer、Short、Byte、Character、Long這幾個類的valueOf方法的實現基本類似,Double和Float機制不同

但是小夥伴們有沒有像我一樣這麼寫,又聯想一下上面看的知識,從而懷疑輸出結果的?

Long num = new Long(12323L);//換成Integer 或者int long 都一樣
if (num  == 12323L) {
	System.out.println(true);
} else {
    System.out.println(false);
}

結果輸出的是: true

不要意外,我開始也很意外,居然是true,而且沒有代碼檢測讓我換成equal,但是後來一想其實也可以理解,我們過多的去考慮基礎類的valueOf方法,嘗試拿cache機制去思考所有的比較問題,但是恰恰忘記了,咱現在寫的num和它比較的,不是對象之間的比較,而是最簡單的數字比較,壓根就不存在cache的問題,真的是好坑,以後遇見數字比較,先看左右兩邊比較的是不是寫死的數字,是寫死的數字,== 沒問題,如果是對象之間的比較,還是equal保險

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章