最新消息:文章中包含代码时,请遵守代码高亮规范!

项目中包装类使用的注意点

Java 施, 建 25浏览 0评论

最近看项目代码的时候看到一个问题,是关于java中的int和包装类Integer的.

先说下背景,项目中所有entity类中的int类型的成员变量全部要求使用Integer包装类,不许用int,这时候比如有个商品对象中有个颜色的成员变量,用的是数字加加枚举来表示的(类似于1就代表是红色,2就代表蓝色,3代表黄色这个样子)这是背景.

接下来就是项目中的代码了,在判断两个商品颜色是否相同的时候直接使用的这种if(product1.getColor()==product2.getColor()).直接使用了==号判断两个包装类型Integer是否相等;

这个时候就有趣了,因为java中的==作用到基本数据类型的时候判断值是否相等,如果放到两个引用类型变量中间,则是判断这个两个引用是否指向同一个对象.按照这个逻辑来看,不管你两个商品颜色是否一样,使用的对应肯定不是同一个,所以这个地方应该总是返回fasle才对.然而程序运行一切ok,完全没问题,这是为什么呢?

原来是因为int自动装箱的时候用的是valueOf方法代码如下:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

有兴趣的可以自己看下IntegerCache中的代码,在Integer类加载的时候会缓存-128到127(可以通过配置修改)之间的所有Integer,所有如过你的代表颜色的数字是在这直接的,使用==判断完全没问题,但是如果你的颜色超过了127,那就不会缓存了,每次都会执行代码中的return new Integer(i)了,这个时候再使用==去判断,那就永远都返回false了.所以对应包装类来说,还是推荐使用eqauls方法来判断是否相等,最后别用==来判断了.

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/24450.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者joy1的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!