List集合在边遍历边删除时使用for循环会报错java.util.ConcurrentModificationException

List集合在边遍历边删除时使用for循环会报错java.util.ConcurrentModificationException

错误方法:

List<Integer> resultList = new ArrayList<>();
resultList.add(1);
resultList.add(2);
resultList.add(3);
for (Integer temp : resultList){
    if (temp == 1){
        resultList.remove(temp);
    }
}
 System.out.println(resultList.toString());

造成报错

java.util.ConcurrentModificationException

正确方法:

 List<Integer> resultList = new ArrayList<>();
 resultList.add(1);
 resultList.add(2);
 resultList.add(3);
 resultList.add(4);
 Iterator<Integer> iterator = resultList.iterator();
 while (iterator.hasNext()){
     Integer integer = iterator.next();
     if (integer == 1){
         iterator.remove();
     }
 }
 System.out.println(resultList.toString());

迭代器接口用四个方法:
(1)next();//越过当前位置到达下一位置,跨度一个单元。
(2)hasNext();//检查集合中是否还有元素(迭代器遍历的时候,如果集合没有元素了会报错,因此是后给你hasNext进行判断。)
(3)remove();//使用前需要搭配next(),否则报错,删除越过的元素。
(4)forEachRemaining(args);这个方法可以搭配lambda表达式对集合中的每个元素进行操作。
注意事项:

  1. 在对list列表进行操作的时候,如果是通过Arrays.asList生成的列表无法使用Iterator的remove方法,原因是不支持。报错如下:
UnsupportedOperationException()

解决办法:
将原数组通过流再转换成列表。

1.List<String> list = Arrays.asList(arry).stream().collect(Collectors.toList());
 2.List<String> list = Arrays.stream(arry).collect(Collectors.toList());

两种方式均可。

  1. 在使用remove之前一定要使用next()方法,且两个方法掉用之间不能更改迭代器否则将会报错。
  2. 使用iterator迭代器的时候不可以对集合做维护和新增操作,如果要添加和更改元素,建议使用ListIterator代码如下:
 @Test
    public void test9() {
        String[] arry = {"zuoshou3", "zuoshou2", "zuoshou1"};
        String str = null;
        List<String> list = Arrays.stream(arry).collect(Collectors.toList());
        ListIterator<String> iterator = list.listIterator();
        while(iterator.hasNext()){
            str = iterator.next();
            if (str == "zuoshou3"){
                iterator.remove();
            }
            if (str == "zuoshou2"){
                iterator.set("zuoshou2A");
            }
            if (str == "zuoshou1"){
                iterator.add("zuoshou1After");
            }
        }
        list.forEach(System.out::println);
    }
zuoshou2A
zuoshou1
zuoshou1After

注: 文章是本人这段时间所学,如有错误的地方欢迎指正,互相交流!

上一篇:android中的颜色设置


下一篇:C++——STL