Рассмотрим ArrayList, где для операций Iterator и List iterator, когда список повторяется и всякий раз, когда происходит изменение в объекте 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 сценария противоположны друг другу. Пожалуйста, дайте мне знать, когда они используются и в каких сценариях?
Это совершенно сбивает с толку...