黑马程序员技术交流社区

标题: 并发修改异常 [打印本页]

作者: LsEmpire    时间: 2017-2-25 16:20
标题: 并发修改异常
List list = new ArrayList();
                list.add("a");
                list.add("a");
                list.add("world");
                list.add("a");
                ListIterator lit = list.listIterator();
                while(lit.hasNext()) {
                        String str = (String)lit.next();
                        if("world".equals(str)) {
                                lit.add("javaee");
                        }
                }
                System.out.println(list);
这段代码,是增加不会出现并发修改异常


ArrayList<String> list = new ArrayList<>();
                list.add("a");
                list.add("a");
                list.add("b");
                list.add("b");

                ListIterator<String> lit = list.listIterator();
                ListIterator<String> lit1 = list.listIterator();
                while(lit.hasNext()) {
                        String s = lit.next();
                        boolean b = true;
                        while(lit1.hasNext()) {
                                String s1 = lit1.next();
                                if(b && s.equals(s1)){
                                        b = false;
                                        continue;
                                }
                                if(s.equals(s1) && !b) {
                                        lit1.remove();
                                }
                        }
                }
                System.out.println(list);
这段我想删除重复,用的也是ListIterator为何会报错,并发修改异常!
谢谢指导!~~
作者: LsEmpire    时间: 2017-2-25 16:27
        ArrayList<String> list = new ArrayList<>();
                list.add("a");
                list.add("a");
                list.add("b");
                list.add("b");
                for (String str : list) {
                        ListIterator<String> lit = list.listIterator();
                        boolean first = true;
                        while(lit.hasNext()) {
                                if(first && str.equals(lit.next())) {
                                        first = false;
                                        continue;
                                }
                                if(str.equals(lit.next()) && !first) {
                                        lit.remove();
                                }
                }
                System.out.println(list);
这样也是并发修改异常。
求解为何异常?
作者: flying81621    时间: 2017-2-25 22:59
先顶一下!!!!!!!!
作者: flying81621    时间: 2017-2-25 23:13
没找出原因,还是再顶一下把
作者: yeluoxingye    时间: 2017-2-25 23:18
迭代器嵌套吗?内部迭代器操作完后,会改变集合,但是外部的迭代器还在遍历。所以会有并发修改异常

作者: yeluoxingye    时间: 2017-2-25 23:21
2楼增强for循环底层是用迭代器实现的,所以跟一楼类似,出现并发修改异常

作者: Port    时间: 2017-2-26 02:31
并发修改异常……

作者: LsEmpire    时间: 2017-2-26 22:06
yeluoxingye 发表于 2017-2-25 23:18
迭代器嵌套吗?内部迭代器操作完后,会改变集合,但是外部的迭代器还在遍历。所以会有并发修改异常
...

就是说,内层的迭代器每次都在创建,会知道有没有变化。但是while外面的就创建一次,不知道里面的变化?但是第一段代码,也是在while外面创建的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2