使用==比较Sorted ArrayList元素:为何部分匹配后失效?
问题分析与解答
核心根源:Integer缓存机制 + ==与equals的本质差异
先把两个关键逻辑掰明白:
- ==的作用:如果是Integer这种引用类型,
==比的是两个对象在内存里的地址是否一致,不是比数值;但如果是int这种基本类型,==才是直接比较数值大小。 - Integer的缓存优化:Java为了节省内存,会提前缓存
-128到127之间的Integer对象。比如你写Integer a = 100和Integer b = 100,这俩其实是同一个缓存对象,地址完全相同;但如果是Integer a = 200和Integer b = 200,就会各自新建独立对象,地址不一样。
为什么前部分匹配成功,后面失败?
你的两个有序列表里,前几个公共元素刚好落在-128~127这个缓存区间内:
- 这部分元素:两个列表里相同数值的Integer是同一个缓存对象,地址相同,所以
==返回true,能正常加入结果列表。 - 后面的元素:数值超出了缓存范围,两个列表里相同数值的Integer是各自新建的独立对象,地址不一样,
==返回false。而你是按有序列表的双指针逻辑处理的,一旦匹配失败就会移动指针,直接跳过了后续本该匹配的元素,导致循环提前终止。
为什么list1.get(i)-1 == list2.get(j)-1能正常工作?
这里触发了Java的自动拆箱:当你对Integer对象做算术运算(比如减1)时,Java会自动把Integer转换成基本类型int,此时==比较的就是两个int的数值大小,不管数值在不在缓存区间里,自然能正确匹配。
正确的处理方式
只要是引用类型的元素比较,就用equals()方法(如果是自定义类,记得重写equals来实现值比较),比如:
if (list1.get(i).equals(list2.get(j))) { resultList.add(list1.get(i)); i++; j++; }
内容的提问来源于stack exchange,提问作者Robot..
相关产品推荐
相关产品推荐

