从一个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);
结果

ArrayList 中的 batchRemove arraylist的remove方法_i++

上面结果可见,在使用 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);

ArrayList 中的 batchRemove arraylist的remove方法_删除元素_02


上图结果显示,虽然 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);

ArrayList 中的 batchRemove arraylist的remove方法_删除元素_03


所以对于保存了Integer类型的ArrayList来说,因为自动装箱机制的存在,可能添加元素的时候直接使用int类型的元素即可。但是在删除元素的时候就需要注意,如果想要寻找特定元素进行删除,就需要将int值转换为Integer再作为参数传给remove元素,否则传入的int值会作为索引,导致删除错误的元素。