一次帮同事排查Integer类型比较==的问题

同事要对一个集合做过滤,集合中的对象Sku中有两个Integer的属性,一个是商品的真实库存数量stockNum,一个是商品的预占库存occupyNum

 

要将所有真实库存数量与预占库存数量相等的数据、不相等的数据分别收集起来。

 

public class Sku {

    private Long wareId;
    private Integer stockNum;
    private Integer occupyNum;
    
    // .....省略

}




public void test(){
        List<Sku> skuList = //...省略调用;

        List<Sku> equalList = skuList.stream().filter(it -> it.getStockNum() == it.getOccupyNum()).collect(Collectors.toList());
        List<Sku> notEqualList = skuList.stream().filter(it -> it.getStockNum() != it.getOccupyNum()).collect(Collectors.toList());




    }

问题是当实际库存数量和预占库存数量相等,并且在128以下的都收集到equalList集合里了,但是实际库存数量和预占库存数量同样相等,但是128以上的都收集到notEqualList 集合中去了。按理说都相等行为应该一致呀

原因就是:Interger、Long等基本类型都有常量池,java底层使用的享元模式,就是在-128~127之间创建的Integer都是用的常量池中的同一个值,因此内存地址也是一样的,超过了就是使用的真实的对象做的比较。另外如果不涉及到运算,Integer是不会自动拆箱的,所以使用==或者!=是比较的内存地址。

 

 

解决方案:比较对象中的值是否相等请使用equals,不要使用==或者!=

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值