自定义一个ArrayList然后把符合条件的元素删除。

第一种方法:顺序循环,减一操作,把符合条件的元素删除;如果不进行减一操作,当list把符合条件的元素删除后,后面符合的元素可能不会删除,导致程序出错。



import java.util.ArrayList;
import java.util.List;

public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Tom");
list.add("Tom");
list.add("David");
list.add("Lily");
list.add("Lucy");
list.add("James");
for (int i = 0; i < list.size(); i++) {
if ("Tom".equals(list.get(i))) {
list.remove(i);
// 减一操作
i--;
}
}
System.out.println(list.toString());
}
}


结果如下:

关于List的remove()方法_迭代器

错误代码:


关于List的remove()方法_迭代器_02关于List的remove()方法_倒序_03


import java.util.ArrayList;
import java.util.List;

public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Tom");
list.add("Tom");
list.add("David");
list.add("Lily");
list.add("Lucy");
list.add("James");
for (int i = 0; i < list.size(); i++) {
if ("Tom".equals(list.get(i))) {
list.remove(i);
}
}
System.out.println(list.toString());
}
}

View Code

结果如下:

关于List的remove()方法_迭代器_04

 为什么会出现这种情况呢?原来List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取。

 第二种方法:倒序循环,把符合条件的元素直接删除。



import java.util.ArrayList;
import java.util.List;

public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Tom");
list.add("Tom");
list.add("David");
list.add("Lily");
list.add("Lucy");
list.add("James");
for (int i = list.size() - 1; i >= 0; i--) {
if ("Tom".equals(list.get(i))) {
list.remove(i);
}
}
System.out.println(list.toString());
}
}


结果如下:

关于List的remove()方法_迭代器

  第三种方法:使用迭代器,把符合条件的元素删除。



import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Tom");
list.add("Tom");
list.add("David");
list.add("Lily");
list.add("Lucy");
list.add("James");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if ("Tom".equals(it.next())) {
it.remove();
}
}
System.out.println(list.toString());
}
}


结果如下:

关于List的remove()方法_迭代器

 推荐使用第三种方法进行remove操作。