工作纪实_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保险

发布了17 篇原创文章 · 获赞 4 · 访问量 3383

猜你喜欢

转载自blog.csdn.net/u013553309/article/details/104622798