You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用==比较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..

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:40:23