从一个ArrayList中去除某个元素时会用到remove方法,这个方法有两个版本
//根据下标索引删除
public E remove(int index) {
Objects.checkIndex(index, size);
final Object[] es = elementData;
@SuppressWarnings("unchecked") E oldValue = (E) es[index];
fastRemove(es, index);
return oldValue;
}
//根据对象删除,用equals()方法判断对象是否相等,若相等则删除
public boolean remove(Object o) {
final Object[] es = elementData;
final int size = this.size;
int i = 0;
found: {
if (o == null) {
for (; i < size; i++)
if (es[i] == null)
break found;
} else {
for (; i < size; i++)
if (o.equals(es[i]))
break found;
}
return false;
}
fastRemove(es, i);
return true;
}
-
remove()方法如果接收的是一个int类型的值,则这个值表示的是要删除的元素的索引值,方法返回的值就是被删除的元素,如果索引值在实际的范围外,则会抛出IndexOutOfBoundsException异常。
-
如果接收的是一个object类型的值,则会依次和list中每个元素比较(使用的是equals方法),如果存在,就删除掉第一个遇到的元素,并返回true。
使用例子:
//创ArrayList对象,并往里添加内容
ArrayList<String> list1= new ArrayList<>();
for (int i=0;i<10;i++){
list1.add("item"+i);
}
for (int i=0;i<list1.size();i++){
String text = list1.remove(i);//通过下标删除list1内的内容
System.out.println(text);
}
System.out.println(list1);
结果
上面结果可见,在使用 i<list1.size() 为判断条件时,无法完全删除里面的内容,原因是:在删除的过程中 list1.size() 也随着删除的进行而减小,而 i 却在不断增加,这个是我们常见的错误。要想全部删除,可以每次删除完后进行i–。
例子二:
//创建一个新的ArrayList对象,并往里添加内容
ArrayList<String> list2 = new ArrayList<>();
for (int i=0;i<10;i++){
list2.add(i);
}
for (int i=0;i<list2.size();i++){
int num = list2.remove(i);
System.out.print(num + " ");
}
System.out.println();
System.out.println(list2);
上图结果显示,虽然 list2 里面装的是 integer 类型的函数,如果直接传入 int 型的数字,会调用的通过下标索引的 remove() 方法。而不是调用通过对象删除的 remove 方法。
若要调用通过对象删除的 remove 方法,则需要使用 Integer.valueOf() 进行封装。
for (int i=0;i<list2.size();i++){
list2.remove(Integer.valueOf(i));
}
System.out.println(list2);
所以对于保存了Integer类型的ArrayList来说,因为自动装箱机制的存在,可能添加元素的时候直接使用int类型的元素即可。但是在删除元素的时候就需要注意,如果想要寻找特定元素进行删除,就需要将int值转换为Integer再作为参数传给remove元素,否则传入的int值会作为索引,导致删除错误的元素。