Java 中 ArrayList remove() 的不良行为

2022-09-02 19:37:30

我有以下两种情况:

1. 整数值作为参数

int intNum = 2;
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.remove(intNum);
System.out.println(list.size());
// output: 2

2.长值作为参数

long longNum = 2;
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.remove(longNum);
System.out.println(list.size());
// output: 3

在这两种情况下,我都传递 2 作为值,但我得到的列表大小值不同。这种行为的真正原因是什么?

从列表中正确删除整数并不能解释内置数据类型具有相同的值,但如上所述具有不同的行为


答案 1

自动装箱

该方法已重载,并且两个不同的签名用于不同的目的。一个 , 根据索引删除项目,另一个 根据对象相等性删除项目。第一种情况触发第一种类型,第二个示例(带有 )触发第二种类型,将基元自动装箱到对象。这不等于添加到列表中的(自动装箱的)值,因此不会从列表中删除任何内容,并且大小将保持不变。list.removelist.remove(int)list.remove(Object)long longNumlongjava.lang.Longjava.lang.Integer


答案 2

从 List.remove() 文档中

remove(int 索引) 删除此列表中指定位置处的元素(可选操作)。

remove(Object o) 从此列表中删除指定元素的第一个匹配项(如果存在)(可选操作)。

removeAll(集合 c) 从此列表中删除指定集合中包含的所有元素(可选操作)。

如果你的第二个示例确实是很长的,它不会被删除(因为它使用第二个删除方法)。