ConcurrentModificationException使用列表迭代器Java删除元素时

时间:2019-04-21 21:34:50

标签: java list loops iterator

即使使用迭代器,我也无法删除列表的第一和第二元素。

我已阅读以下主题,但无法解决我的问题(那些问题最相关,但我也检查了其他材料):

ConcurrentModificationException when trying remove element from list

Iterating through a Collection, avoiding ConcurrentModificationException when removing objects in a loop

所以我的代码如下:

    List<List<String>> list = cnf.read();
    List<List<String>> nlist = new ArrayList<>();
    for (List<String> l : list) {
        if (l.size() <= 3) {
            nlist.add(l);
        } else {
            int size = l.size();
            while (size > 3) {
                List<String> three = l.subList(0, 2);
                three.add("Y" + (count++));
                //Iterator itr = l.iterator();
                ListIterator itr = l.listIterator();
                int v = 0;
                while (itr.hasNext()) {
                    itr.next();
                    if (v == 0 || v == 1){
                        itr.remove();
                        v++;
                    }
                }
                l.add(0, "Y" + (count++));
                size--;
                nlist.add(three);
            }
            nlist.add(l);
        }
    }
    for (List<String> l : nlist) {
        System.out.println(l.toString());
        System.out.println(l.size());
    }

我在这里的打印语句中收到ConcurrentModificationException:

  

System.out.println(l.toString());

我也尝试在2个for循环中使用迭代器,但这似乎没有什么不同! 我是刚开始发布问题的人,所以如果我做得对,请通知我! 谢谢。

1 个答案:

答案 0 :(得分:0)

经过长时间的调试,这是解决方法。

sublist函数按引用而不是按值传递,由ArrayList.subList调用创建的子列表保留对原始列表的引用,并直接访问其elementData数组。

因此,将元素添加到“三个”列表时,我们将更改原始列表的状态。发生在这里:

  

three.add(“ Y” +(count ++));

对此特定情况进行修复的一种方法是通过以下方式创建和初始化“三个”列表:

                String one = l.get(0);
                String two = l.get(1);
                List<String> three = new ArrayList<>();
                three.add(one);
                three.add(two);
                three.add("Y" + (count));

这使我们可以在不获取并发异常(ConcurrentModificationException)的情况下操作列表。但是,如果要处理大列表,建议您使用另一种不太硬编码的方法来创建列表。

我会将这个主题标记为已回答,希望它对人们有所帮助。