关于List的remove()方法
自定义一个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()); } }
结果如下:
错误代码:
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()); } }
结果如下:
为什么会出现这种情况呢?原来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()); } }
结果如下:
第三种方法:使用迭代器,把符合条件的元素删除。
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()); } }
结果如下:
推荐使用第三种方法进行remove操作。