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

Java中ArrayList数值比较异常:相等数值为何判定不等?

为啥ArrayList移除元素后两个100000用==判断不相等?

这绝对不是Java的BUG,而是你踩了Integer自动装箱的缓存机制的坑!咱们来一步步拆解问题:

问题根源:Integer的缓存范围

Java为了优化性能,对Integer类型的小数值做了缓存——默认情况下,只有**-128到127**之间的整数,在自动装箱时会复用同一个对象实例。而你的代码里用的是100000,这个数值远远超出了缓存范围,所以每次调用arr1.add(100000)时,都会新建一个独立的Integer对象。

看你代码里的操作:

ArrayList<Integer> arr1=new ArrayList<Integer>();
arr1.add(100000); // 新建Integer对象A
arr1.add(1); // 1在缓存范围内,复用缓存对象
arr1.add(100000); // 新建Integer对象B
arr1.remove(1); // 移除索引1的元素(也就是那个值为1的元素)

此时arr1里剩下的是对象A和对象B,它们的数值都是100000,但是两个不同的对象实例。而==对于引用类型来说,比较的是对象的内存地址,不是实际的数值,所以arr1.get(0)==arr1.get(1)会返回false,自然输出damnit。

解决方案

要比较Integer的数值是否相等,有两种靠谱的方式:

  1. 使用equals()方法:这是专门用来比较对象内容的方法
  2. 把Integer自动拆箱成int类型再比较:int是基本类型,==会直接比较数值

修改后的代码示例:

package deleteit;
import java.lang.*;
import java.io.*;
import java.util.*;
public class Deleteit {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        ArrayList<Integer> arr1=new ArrayList<Integer>();
        arr1.add(100000);
        arr1.add(1);
        arr1.add(100000);
        arr1.remove(1);
        // 方案1:用equals比较
        if(arr1.get(0).equals(arr1.get(1))) {
            System.out.println("GUd");
        } else System.out.println("damnit");
        
        // 方案2:拆箱成int比较
        // if((int)arr1.get(0) == (int)arr1.get(1)) {
        //     System.out.println("GUd");
        // } else System.out.println("damnit");
    }
}

不管用哪种方案,都会输出你预期的GUd。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:21:45