疑问:if(arr.get(i)-arr.get(j)==0)与if(arr.get(i)==arr.get(j))是否有差异?
两个数组元素相等判断语句的差异分析
你遇到的问题核心是这两个判断语句在处理包装类型数值时的行为完全不同:
if (arr.get(i) - arr.get(j) == 0) if (arr.get(i) == arr.get(j))
差异点解析
arr.get(i) == arr.get(j):如果数组中的元素是Java的包装类型(比如Integer、Long),==比较的是对象的内存引用,而非数值本身。只有当两个引用指向同一个对象时才会返回true——比如小范围整数(Integer缓存池默认-128到127)会复用对象,但超出这个范围的数值会生成新对象,此时即使值相同,==也会返回false。arr.get(i) - arr.get(j) == 0:减法操作会触发自动拆箱,把包装类型转换成对应的基本类型(比如Integer转int),之后进行数值运算,再判断结果是否为0。这种方式直接比较的是数值大小,和对象引用无关,只要值相等就会返回true。
测试用例失败原因
你遇到的7/10测试用例不通过,大概率是因为这些用例中的数组元素是超出包装类型缓存范围的数值,或者是通过不同实例创建的同值对象。此时==判断引用不相等导致逻辑错误,而减法拆箱的方式正确识别了数值相等,所以修改后所有用例都通过了。
内容的提问来源于stack exchange,提问作者Shantanu Gaware
相关产品推荐
相关产品推荐

