ConcurrentModificationException 集合并发修改异常 解决

简介: import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /** * 问题? * 有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

/**
 * 问题?
 *         有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
 * 
 *     ConcurrentModificationException: 但方法监测到对象的并发修改,但不允许这种修改时,抛出此异常。
 * 产生的原因:
 *             迭代器是依赖于集合而存在的,在判断成功后,集合中新添加了元素,而迭代器都不知道,所以就报错了,这个错叫并发修改异常。
 *             其实这个问题的描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
 * 
 * 如何解决呢?
 *             A:迭代器迭代元素,迭代器修改元素
 *                 元素时跟在刚才迭代的额元素后面的
 *             B:集合遍历元素,集合修改元素(普通for)
 *                 元素时最后添加的
 *
 *
 */
public class ListIteratorDemo2 {
    public static void main(String[] args) {
        List list=new ArrayList();
        list.add("hello");
        list.add("world");
        list.add("java");
        
//        错误的方式:迭代器迭代元素,集合修改元素,迭代器不知道集合的修改,抛出了并发修改异常。
//        Iterator it=list.iterator();
//        while(it.hasNext()){
//            String s= (String)it.next();
//            if("world".equals(s)){
//                list.add("javaee");
//            }
//        }
        
        //正确的方式一: 迭代器迭代元素,迭代器修改元素 
//        ListIterator lit=list.listIterator();
//        while(lit.hasNext()){
//            String s=(String)lit.next();
//            if("world".equals(s)){
//                lit.add("javaee");
//            }
//        }
        
        
        //正确的方式二:集合遍历元素,集合修改元素(普通for)
        for(int i=0;i<list.size();i++){
            String s=(String)list.get(i);
            if("world".equals(s)){
                list.add("javaee");
            }
        }
        
        System.out.println("list: "+list);
    }
}
开始做,坚持做,重复做
相关文章
|
4月前
并发修改异常ConcurrentModificationException详解(二)
并发修改异常ConcurrentModificationException详解
27 0
并发修改异常ConcurrentModificationException详解(二)
|
4月前
并发修改异常ConcurrentModificationException详解(一)
并发修改异常ConcurrentModificationException详解
34 0
并发修改异常ConcurrentModificationException详解(一)
|
存储 安全 Java
【HashMap并发修改异常】
【HashMap并发修改异常】
308 0
集合线程安全问题:第一章:集合类不安全之并发修改异常
集合线程安全问题:第一章:集合类不安全之并发修改异常
集合线程安全问题:第一章:集合类不安全之并发修改异常
避免list的并发修改异常的几种方式
避免list的并发修改异常的几种方式
你真的明白关于迭代器的方法、使用异常、并发修改异常介绍嘛?
关于迭代器的方法、使用异常、并发修改异常介绍的使用
101 0
你真的明白关于迭代器的方法、使用异常、并发修改异常介绍嘛?
集合或映射迭代过程进行删除或修改操作的时候会导致并发异常
集合或映射迭代过程进行删除或修改操作的时候会导致并发异常
125 0
集合或映射迭代过程进行删除或修改操作的时候会导致并发异常
|
存储 安全 Java
三种骚操作绕过迭代器遍历时的数据修改异常
三种骚操作绕过迭代器遍历时的数据修改异常
155 0
三种骚操作绕过迭代器遍历时的数据修改异常
|
Java 容器
为什么 HashMap 并发时会引起死循环?
今天研读Java并发容器和框架时,看到为什么要使用ConcurrentHashMap时,其中有一个原因是:线程不安全的HashMap, HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,查找时会陷入死循环。
为什么 HashMap 并发时会引起死循环?
简单说明:ArrayList 在 For 循环中进行删除而产生异常的原因
经常会有人这么对 list 进行遍历,错而不自知。 示例代码如下: public static void main(String[] args) { List<String> list = new ArrayList<>(); list.
7029 0

热门文章

最新文章