同事要对一个集合做过滤集合Φ的对象Sku中有两个Integer的属性,一个是商品的真实库存数量stockNum一个是商品的预占库存occupyNum
要将所有真实库存数量与预占库存数量相等的数据、不相等的数据分别收集起来。
问题是当实际库存数量和预占库存数量相等并且在128以下的都收集到equalList集合里了,但是实际库存数量和预占库存数量同样相等但是128以上的都收集到notEqualList 集合中去了。按理说都相等行为应该一致呀
原因就是:Interger、Long等基本类型都有常量池java底层使用的享元模式,就是在-128~127之间创建的Integer都是用的常量池中的同一个值因此内存地址也是一样的,超过了就是使用的真实的对象做的比较另外如果不涉及箌运算,Integer是不会自动拆箱的所以使用==或者!=是比较的内存地址。
解决方案:比较对象中的值是否相等请使用equals不要使用==或者!=