Java中Integer类型用==比较部分测试用例失败原因求解
测试用例失败原因解析
核心原因是Java的Integer类缓存机制导致引用判断逻辑不符合预期:
ArrayList<Integer>存储的是Integer引用类型对象,你用==做判断时,实际比较的是两个对象的内存地址是否一致,而非对象存储的数值是否相等。- Java 8默认会对
-128~127区间的Integer对象做缓存,该区间内的数值自动装箱得到的Integer实例都是复用缓存中的同一个对象,所以用==判断地址也会返回true,这就是你本地可见测试用例全部通过的原因——可见用例的元素值都落在缓存区间内。 - 你题目中给出的元素取值范围最大到
10^9,当数值超过127时,每次自动装箱都会生成全新的Integer对象,哪怕两个对象存储的数值完全相同,内存地址也会不同,此时==判断就会返回false,导致逻辑错误,提交失败的6个测试用例都包含超出缓存区间的数值。
修改后逻辑生效的原因:Integer.compare(int x, int y)方法执行时会先把入参的Integer对象自动拆箱为基础类型int,直接比较数值大小,返回0即代表数值相等,完全不受Integer缓存机制的影响,所以所有测试用例均可正常通过。
补充:你也可以用
list1.get(i).equals(list2.get(i))实现相同的数值比较效果,该方法是Integer类重写的、专门用于比较内部存储数值的方法。
内容的提问来源于stack exchange,提问作者kakashiOfSharingan
相关产品推荐
相关产品推荐

