Java中ArrayList remove()的不良行为

Far*_*que 19 java collections

我有以下两种情况:

1. int值作为参数

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我在两种情况下都传递了2作为值,但是我得到了List的不同大小值.这种行为的实际原因是什么?

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

bee*_*tra 25

自动装箱

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

  • 在第二种情况下选择`Object`重载的原因是因为`long`不能转换为`int`.`Object`重载是唯一可以应用的重载, (7认同)

Use*_*404 5

从List.remove()文档:

remove(int index)移除此列表中指定位置的元素(可选操作).

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

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

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


dej*_*uth 5

小心:第一个移除了Integerat index = 2.看到ArrayList.remove(int)

第二个尝试删除对象ArrayList.remove(Object),但是要删除的对象不存在,因为它是一个Long对象.