代码之家  ›  专栏  ›  技术社区  ›  skip

在CopyOnWriteArrayList上迭代时不支持OperationException

  •  2
  • skip  · 技术社区  · 6 年前

    我在一本书中看到了以下陈述:

    对基于写的副本调用的任何变异方法 Iterator ListIterator (如add、set或remove)将抛出 UnsupportedOperationException .

    不支持操作异常 .

    List<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(4, 3, 52));
    System.out.println("Before " + list);
    for (Integer item : list) {
        System.out.println(item + " ");
        list.remove(item);
    }
    System.out.println("After " + list);
    

    Before [4, 3, 52]
    4 
    3 
    52 
    After []
    

    list 使用 remove 方法?

    1 回复  |  直到 6 年前
        1
  •  7
  •   Mureinik    6 年前

    你在打电话吗 remove 在名单上 ,这很好。文件上说 去除 UpsupportedOperationException . 例如。:

    Iterator<Integer> iter = list.iterator();
    while (iter.hasNext()) {
        Integer item = iter.next(); 
        System.out.println(item + " ");
        iter.remove(); // Will throw an UpsupportedOperationException
    }
    
        2
  •  0
  •   kapishreshth Bob Jacobsen    4 年前

    穆雷尼克的回答看起来不错。但是,如果你深入研究-

    如果使用 ArrayList

    • 使用 for 循环和列表 remove(current_index) 方法,效果很好。

    iterator 接近-

    • 使用迭代器 remove() 方法而不是列表 删除() ,效果不错
    • ConcurrentModificationException 如果使用列表 删除() 方法

    使用 CopyOnWriteArrayList

    • 带列表 remove(current_element)
    • Iterator ListIterator 删除() 方法,它抛出 UnsupportedOperationException

    看看下面的例子-

    import java.util.*;
    import java.util.concurrent.*;
    public class AvoidCMEExample {
       public static void main(String args[]) {
            List<String> listOfBooks = new ArrayList<>();  
           listOfBooks.add("Programming Pearls");
           listOfBooks.add("Clean Code");
           listOfBooks.add("Effective Java");
           listOfBooks.add("Code Complete");
           System.out.println("List before : " + listOfBooks);
           /*for(int i=0; i<listOfBooks.size(); i++){
               String book = listOfBooks.get(i);
               if(book.contains("Programming")){
                   System.out.println("Removing " + book);
                   listOfBooks.remove(i); // works fine
               }
           }*/
           Iterator<String> itr = listOfBooks.iterator();
           while(itr.hasNext()){
                String book = itr.next();
                if(book.contains("Programming")){
                   System.out.println("Removing " + book);
                   //listOfBooks.remove(book); // will throw CME
                   itr.remove(); // using iterator remove(), it works fine
               }
           }
           System.out.println("List after : " + listOfBooks);
           
           List<String> list = new CopyOnWriteArrayList<>(); 
           list.add("B"); list.add("W"); list.add("Q"); list.add("S");
           System.out.println("\n\nList before : " + list);
           Iterator<String> itr1 = list.iterator();
           while(itr1.hasNext()){
                String book = itr1.next();
                if(book.contains("Q")){
                   System.out.println("Removing " + book);
                   list.remove(book); // works fine on list object remove()
                   itr1.remove(); // throws UnsupportedOperationException on iterator, ListIterator obj
               }
           }
           System.out.println("List after : " + list);       
       }
    }
    
    推荐文章