工作中,总是遇到代码检测工具提示我,某些数字之间的比较需要将 == 替换为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保险