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

Java链表去重时用==比较Integer节点数据报错的原因是什么?

链表去重代码中==和equals判断的差异说明

你代码中curr.data是Integer包装类类型,而非基础数据类型int,两种判断逻辑的核心差异如下:

  • ==的判断规则
    • 用于基础数据类型(int、long、char等)时,判断的是数值是否相等
    • 用于引用数据类型(包装类、自定义类对象等)时,判断的是两个对象的内存地址是否一致,即是否为同一个实例
      Java的Integer默认会缓存-128~127区间的数值,该区间内相同数值的Integer会复用缓存实例,用==判断会返回true;但超出这个区间的数值,哪怕数值相同,也会生成不同的实例,==会返回false,这就是你部分用例去重失败的原因。如果该去重的节点没有被删除,后续链表操作逻辑异常就可能触发运行时错误。
  • equals的判断规则
    Integer类已经重写了Object根类的equals方法,逻辑是先校验类型匹配,再对比底层存储的数值是否相等,只要数值相同,不管是不是同一个实例都会返回true,所以可以正确识别所有数值相等的重复节点,也就符合你的去重预期。

你可以参考下面的测试代码验证差异:

public class Test {
    public static void main(String[] args) {
        Integer num1 = 127;
        Integer num2 = 127;
        System.out.println(num1 == num2); // 输出true,属于缓存区间,复用实例
        Integer num3 = 128;
        Integer num4 = 128;
        System.out.println(num3 == num4); // 输出false,超出缓存区间,是不同实例
        System.out.println(num3.equals(num4)); // 输出true,数值相等
    }
}

补充注意事项

如果业务场景中链表的data字段可能为null,直接调用equals会触发空指针异常,这种情况可以改用java.util.Objects.equals(curr.data, curr.next.data),该工具方法会自动处理null场景,两个值都为null时也会返回true,不会抛出异常。


内容的提问来源于stack exchange,提问作者Varun Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:27:04