美文网首页
List遍历时修改元素的问题

List遍历时修改元素的问题

作者: 张轻舟 | 来源:发表于2019-05-28 15:40 被阅读0次

请编写代码完成以下需求:
判断一个List里面是否包含monkey,如果包含的话,向集合中添加1024这个字符串。


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

/**
 * 判断一个List里面是否包含monkey,如果包含的话,向集合中添加1024这个字符串。
 *
 */
//通过注解去除黄色警告
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ListTest02 {

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("monkey");
        list.add("d");
        list.add("e");

        Iterator iter = list.iterator();
        while(iter.hasNext()) {
            String str = (String)iter.next();//ConcurrentModificationException并发修改异常
            if(str.equals("monkey")) {
                list.add("1024");
            }
        }
    }


}

上面代码在向list中添加完元素之后再执行到String str = (String)iter.next();这行时,报出ConcurrentModificationException异常,通过ArrayList的源码可以看到,当modCount不等于expectedModCount时才会报出这个异常,上面代码在遍历集合时添加了一个元素,这样就修改了集合中的元素个数,所以会导致modCount不等于expectedModCount,这样就会报出ConcurrentModificationException异常。

如果想要解决上面的问题,需要使用ListIterator去遍历,并且使用ListIterator向List中添加元素


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

/**
 * 使用ListIterator解决ConcurrentModificationException
 *
 */
// 通过注解去除黄色警告
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ListTest02 {

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("monkey");
        list.add("d");
        list.add("e");


        // 使用ListIterator解决上面的问题
        ListIterator listIter = list.listIterator();
        while (listIter.hasNext()) {
            String str = (String) listIter.next();
            if (str.equals("monkey")) {
                // 使用list迭代器向集合中添加元素
                listIter.add("1024");
            }
        }
        System.out.println(list);
    }

}

ListIterator中方法简介
在ListIterator中有个previous()和hasPrevious()方法,通过这两个方法,可以将集合中的元素倒序遍历。需要注意的是在倒序遍历之前要将集合先正序遍历。


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

/**
 * ListIterator
 *
 */
//通过注解去除黄色警告
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ListIteratorTest01 {

    public static void main(String[] args) {

        List list = new ArrayList();
        list.add("a");                                    
        list.add("b");
        list.add("world");
        list.add("c");
        list.add("d");
        list.add("e");

        ListIterator listIter = list.listIterator();            
        while(listIter.hasNext()) {
            System.out.println(listIter.next());//获取元素并将指针向后移动
        }

        System.out.println("-----------------");

        while(listIter.hasPrevious()) {
            System.out.println(listIter.previous());         //获取元素并将指针向前移动
        }
    }

}

相关文章

  • List遍历时修改元素的问题

    请编写代码完成以下需求:判断一个List里面是否包含monkey,如果包含的话,向集合中添加1024这个字符串。 ...

  • Java删除List中的元素

    for循环遍历删除 使用for遍历删除的问题在于删除某元素后,List的大小变化了,会导致遍历时漏掉某些元素,例如...

  • python3 list遍历时删除

    问题:python3遍历list过程中通过list的remove删除列表元素后,将导致遍历元素不完整。 复现: 输...

  • 【Java】数组和List相互转换(asList)

    Array转List 注意这里list里面的元素直接是s里面的元素,对s的修改,直接影响list; List转Ar...

  • 03.基本数据类型--列表

    1). List列表 list类,列表,有序的(下标从0开始),元素可以被修改 list 类、中括号括起来,逗号分...

  • 列表

    修改列表元素: list[1,2,"python"]:列表,类似于C和Java的数组example_list = ...

  • 循环控制: for循环2

    使用for循环遍历 list 使用for循环,将list 中的每个元素都操作一遍 遍历 list def for_...

  • 59.kotlin创建list集合

    1.创建固定元素个数的list集合 listof()简单方法创建的list集合不能添加,不能修改元素,是一个只读的...

  • 09Dart:List

    在Dart中,数组是List对象,可以直接打印list包括list的元素,list也是一个对象。但是java必须遍...

  • Tips

    权重 在选择了元素准备做修改的时侯,如想修改class = 'list' 的内容,不要直接用('.father ....

网友评论

      本文标题:List遍历时修改元素的问题

      本文链接:https://www.haomeiwen.com/subject/idsdtctx.html