Как изменить 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));