Java 如何在没有ConcurrentModificationException的情况下修改子列表?

Java 如何在没有ConcurrentModificationException的情况下修改子列表?,java,iterator,linked-list,sublist,Java,Iterator,Linked List,Sublist,我对ListIterator有点问题 我已经开始迭代原始列表[1,4,5],我介于1和4之间。然后我将列表修改为[1,2,3,4,5]。现在我想迭代原始列表的其余部分。这里我给出一个示例代码: public class Test { public static void main(String[] args) { List<Integer> list = new LinkedList<Integer>(); // []

我对
ListIterator
有点问题

我已经开始迭代原始列表
[1,4,5]
,我介于
1
4
之间。然后我将列表修改为
[1,2,3,4,5]
。现在我想迭代原始列表的其余部分。这里我给出一个示例代码:

public class Test {
    public static void main(String[] args) {        
        List<Integer> list = new LinkedList<Integer>();  // []
        list.add(new Integer(1));  // [1]
        list.add(new Integer(4));  // [1, 4]
        list.add(new Integer(5));  // [1, 4, 5]
        ListIterator<Integer> iterator = (ListIterator<Integer>) list.iterator();

        System.out.println(iterator.next()); // prints [1]

        // modify subList
        List<Integer> subList = list.subList(0, 2);    // [1, 4]
        subList.add(1, new Integer(2));    // [1, 2, 4]
        subList.add(2, new Integer(3));    // [1, 2, 3, 4]

        // need to print rest of oryginal list: [4, 5]
        while (iterator.hasNext())
            System.out.println(iterator.next());
    }
}
公共类测试{
公共静态void main(字符串[]args){
列表=新建LinkedList();//[]
list.add(新整数(1));//[1]
添加(新的整数(4));//[1,4]
添加(新的整数(5));//[1,4,5]
ListIterator迭代器=(ListIterator)list.iterator();
System.out.println(iterator.next());//prints[1]
//修改子列表
列表子列表=列表。子列表(0,2);//[1,4]
subList.add(1,新整数(2));//[1,2,4]
添加(2,新整数(3));//[1,2,3,4]
//需要打印oryginal列表的其余部分:[4,5]
while(iterator.hasNext())
System.out.println(iterator.next());
}
}

当我执行它时,我得到了java.util.ConcurrentModificationException。您知道如何正确执行吗?

如果您通过迭代器(而不是通过列表)对列表进行修改,则不会得到
ConcurrentModificationException

    System.out.println(iterator.next()); // prints [1]

    iterator.add(new Integer(2)); // [1, 2, 4]
    iterator.add(new Integer(3)); // [1, 2, 3, 4]

    while (iterator.hasNext())
        System.out.println(iterator.next());

如果通过迭代器(而不是列表)对列表进行修改,则不会得到
ConcurrentModificationException

    System.out.println(iterator.next()); // prints [1]

    iterator.add(new Integer(2)); // [1, 2, 4]
    iterator.add(new Integer(3)); // [1, 2, 3, 4]

    while (iterator.hasNext())
        System.out.println(iterator.next());

你误解了的用法

子列表只是原始列表的一部分的视图。如果修改子列表,实际上是在修改原始列表

您需要的是复制原始列表的一部分:

List<Integer> subList = new ArrayList<Integer>(list.subList(0,2));
List subList=newarraylist(List.subList(0,2));

您误解了的用法

子列表只是原始列表的一部分的视图。如果修改子列表,实际上是在修改原始列表

您需要的是复制原始列表的一部分:

List<Integer> subList = new ArrayList<Integer>(list.subList(0,2));
List subList=newarraylist(List.subList(0,2));

在迭代时不能修改某些内容。你必须制作一个副本来修改和迭代原始文件。你不能在迭代过程中修改某些内容。您必须创建一个副本才能修改和迭代原始文件。2和3将自动跳过。在文档中关于:“新元素插入到隐式游标之前:后续调用next将不受影响,后续调用previous将返回新元素。”当我修改子列表时,我没有访问原始迭代器的权限。@WojciechKo在这种情况下,另一个选项是使用-它在快照上返回迭代器,因此它们永远不会抛出
ConcurrentModificationExceptions
。另一种选择是使用a-它的迭代器是弱一致的,并且永远不会抛出
ConcurrentModificationExceptions
@WojciechKo,或者您可以使用a,其迭代器也是弱一致的2和3将自动跳过。在文档中关于:“新元素插入到隐式游标之前:后续调用next将不受影响,后续调用previous将返回新元素。”当我修改子列表时,我没有访问原始迭代器的权限。@WojciechKo在这种情况下,另一个选项是使用-它在快照上返回迭代器,因此它们永远不会抛出
ConcurrentModificationExceptions
。另一种选择是使用a—它的迭代器是弱一致的,并且永远不会抛出
ConcurrentModificationExceptions
@WojciechKo,或者您可以使用a,它的迭代器也是弱一致的