工作中,總是遇到代碼檢測工具提示我,某些數字之間的比較需要將 == 替換爲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保險