zoukankan      html  css  js  c++  java
  • java基础面试题15--迭代器并发修改异常ConcurrentModificationException


    问题:
    我有一个集合,如下,请问,我想判断里面有没有”world”这个元素,如果有,我就添加一个”javaee”元素,请写代码实现。

    使用普通迭代器出现的异常:
    ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

    产生的原因:
    迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
    其实这个问题描述的是:普通迭代器遍历元素的时候,通过集合是不能修改元素的。

    解决:
    A:迭代器迭代元素,迭代器修改元素
       元素是跟在刚才迭代的元素后面的。
    B:集合遍历元素,集合修改元素(普通for循环进行遍历)
       元素是在最后添加的。

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.ListIterator;
    
    public class ListIteratorDemo2 {
        public static void main(String[] args) {
            // 创建List集合对象
            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"); //这里报错!!!!
            // }
            // }
    
            方式1:迭代器迭代元素,迭代器修改元素
            而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
            ListIterator lit = list.listIterator();
            while (lit.hasNext()) {
                String s = (String) lit.next();
                if ("world".equals(s)) {
                    lit.add("javaee");
                }
            }
    
            方式2:集合遍历元素,集合修改元素(普通for)
            for (int x = 0; x < list.size(); x++) {
                String s = (String) list.get(x);
                if ("world".equals(s)) {
                    list.add("javaee");
                }
            }
    
            System.out.println("list:" + list);
        }
    }
  • 相关阅读:
    Iphone和iPad适配, 横竖屏
    JSONModel
    iPhone socket 编程之BSD Socket篇
    UIImageView 动画 / UIImage 方向
    iOS团队开发者测试
    xcode6以后, 使用.pch
    C# new override
    MVC, MVP, MVVM
    VS2010 VC Project的default Include设置
    centos 7 安装mysql5.6rpm格式197
  • 原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932802.html
Copyright © 2011-2022 走看看