java list集合的remove(Object o)原理 及删除Integer
事情起源 我在将数组转换为ArrayList集合后想要去删除某些元素
int[] nums=new int[]{1,2,3,4,8,90,5,6};
List<Integer> list= Arrays.stream(nums).boxed().collect(Collectors.toCollection(ArrayList::new));
list.remove(5);
假如现在想传入5删除5
如果直接写5的话 他会默认这个方法是根据index下标来删除的
所以在这里进行转换
list.remove((Integer) 5);
现在的这个方法是根据传入对象进行删除的
源码图如下
问题来了,既然是根据这个对象删除,那么这两个对象难道相同吗
结论是不相同
让我们来看看源码吧
下面是ArrayList的源码部分
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
可以看出,原来他是调用的传入对象的equals 来判断是否与目标对象等价
下面是Integer 的equals方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
可以看出实际上他们比较的就是数值