Рассмотрим ArrayList, где для операций итератора и итератора списка, когда список повторяется и когда происходит изменение в объекте Collection, он генерирует исключение ConcurrentModificationException, как показано ниже:
package JavaImpPrograms;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Wdfds {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Iterator it=list.iterator();
while(it.hasNext()){
Integer i= (Integer) it.next();
if(i%2==0)
list.remove(0);
}
System.out.println(list); } }
Это не тот случай, когда объект Iterator обновляется, например, как показано ниже:
while(it.hasNext()){
Integer i= (Integer) it.next();
if(i%2==0)
it.remove();
}
System.out.println(list); } }
И когда дело доходит до copyOnWriteArrayList, если объект итератора обновляется с помощью операции удаления для обычного итератора, как показано ниже (или) обновляется listIterator (либо добавление / удаление), то генерируется исключение UnsupportedOperationException:
package JavaImpPrograms;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class Wdfds {
public static void main(String[] args) {
List<Integer> list=new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Iterator it=list.iterator();
while(it.hasNext()){
Integer i= (Integer) it.next();
if(i%2==0)
it.remove();
}
System.out.println(list); } }
package JavaImpPrograms;
import java.util.List;
import java.util.ListIterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class Wdfds {
public static void main(String[] args) {
List<Integer> list=new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
ListIterator it=list.listIterator();
while(it.hasNext()){
Integer i= (Integer) it.next();
if(i%2==0)
it.add(9);
}
System.out.println(list); } }
У меня есть пара вопросов с приведенными выше результатами:
1) Для ArrayList, если итератор может изменять список во время итерации, используя объект итератора, почему для него используется copyOnWriteArrayList?
1) Почему обновления итератора copyOnWriteArrayList генерируют исключения unsupportedOperationExceptions при обнаружении изменений объекта Iterator, но не исключение при изменении объекта коллекции?
3) Похоже, вышеописанные 2 сценария противоположны друг другу. Пожалуйста, дайте мне знать, когда они используются и в каких сценариях?
Это совершенно сбивает с толку ...