Как изменить subList без ConcurrentModificationException?

У меня есть небольшая проблема с 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());
    }
}

Когда я выполняю его, я получаю исключение java.util.ConcurrentModificationException. У вас есть идеи, как я могу сделать это правильно?

2 ответа

Решение

Если вы внесете изменения в список через итератор (а не через список), вы не получите 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.subList,

Подсписок - это просто представление части исходного списка. Если вы изменяете подсписок, вы действительно изменяете исходный список.

Что вы хотите, это скопировать часть оригинального списка:

List<Integer> subList = new ArrayList<Integer>(list.subList(0,2));
Другие вопросы по тегам