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的数值是否相等,有两种靠谱的方式:
- 使用
equals()方法:这是专门用来比较对象内容的方法 - 把
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
相关产品推荐
相关产品推荐

