前言:之前写过一篇博客,python列表删除多个下标,同样地,在Java集合中,需要删除多个元素时,也会遇到并发修改异常的问题,那如何进行处理呢?
目录
给定一个ArrayList列表,删除列表中包含“w”的元素
- package learn11;
-
- import java.util.ArrayList;
- import java.util.List;
-
- public class ListLearn {
- public static void main(String[] args) {
- List
List = new ArrayList<>(); - List.add("learning");
- List.add("wyLearning");
- List.add("test");
- List.add("wy");
- List.add("wangying");
- List.add("wyy");
-
- for (int i = 0; i < List.size(); i++) {
- String s = List.get(i);
- if (s.contains("w")) {
- List.remove(s);
- }
- }
- System.out.println(List);
- }
- }
可以看到,实际上元素并删干净,留下了“wangying”这个元素。
debug一下,可以观察到,在删除了第一个包含“w”的元素后,数组的长度-1,但i的值没有发生变化,所以i跳过了索引为1的元素“test”,也就是这个原因,同理,跳过了“wangying”这个元素。清楚了原理,我们就知道在每删除一个元素时,遍历的索引都-1,就可以解决这个问题了。
- package learn11;
-
- import java.util.ArrayList;
- import java.util.List;
-
- public class ListLearn {
- public static void main(String[] args) {
- List
List = new ArrayList<>(); - List.add("learning");
- List.add("wyLearning");
- List.add("test");
- List.add("wy");
- List.add("wangying");
- List.add("wyy");
-
- for (int i = 0; i < List.size(); i++) {
- String s = List.get(i);
- if (s.contains("w")) {
- List.remove(s);
- i--;
- }
- }
- System.out.println(List);
- }
- }
可以看到结果,含有“w”元素的已经都删掉了。
debug一下,每次删除元素后,索引-1,删掉第一个元素后,继续去遍历,从索引为1的“test”继续往下执行。
当然,遍历元素,还有其他方法,接下来看一下用迭代器遍历,如何处理?
先来看下用普通方法,会有什么报错。
- package learn11;
-
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
-
- public class ListLearn {
- public static void main(String[] args) {
- List
List = new ArrayList<>(); - List.add("learning");
- List.add("wyLearning");
- List.add("test");
- List.add("wy");
- List.add("wangying");
- List.add("wyy");
-
- Iterator
it = List.iterator(); - while (it.hasNext()) {
- String name = it.next();
- if(name.contains("w")) {
- List.remove(name);
- }
- }
- System.out.println(List);
- }
- }
抛出并发修改异常的错误:ConcurrentModificationException
实际上, 迭代器本身提供了删除的方法,使用迭代器提供的remove方法即可。
- package learn11;
-
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
-
- public class ListLearn {
- public static void main(String[] args) {
- List
List = new ArrayList<>(); - List.add("learning");
- List.add("wyLearning");
- List.add("test");
- List.add("wy");
- List.add("wangying");
- List.add("wyy");
-
- Iterator
it = List.iterator(); - while (it.hasNext()) {
- String name = it.next();
- if(name.contains("w")) {
- it.remove();
- }
- }
- System.out.println(List);
- }
- }
无论是在Java还是Python中,在一个容器里删除多个元素时,都要注意下标改变的问题。遇到并发修改异常的报错,要清除哪里除了问题,如果去解决此类问题。