(转)经过CopyOnWriteArrayList,在遍历过程中,对list元素进行删除和添加操作

(转)通过CopyOnWriteArrayList,在遍历过程中,对list元素进行删除和添加操作
CopyOnWriteArrayList是ArrayList的一个线程安全的变体,即可在并发中使用。而它的可变操作都是通过对ArrayList中存储的数组通过一次新的复制来实现的。
   首先讲一下它的用处,如下面的代码:
   List<String> list =new ArrayList<String>();
  list.add("4");
  list.add("5");
  list.add("6");
  Iterator<String> iter = list.iterator();
  while(iter.hasNext()){
   String o = iter.next();
   System.out.println(o);
   list.remove(o);//or list.add("adf");等操作
  }
执行会抛出异常:java.util.ConcurrentModificationException
当然如果吧 list.remove(o);换成iter.remove();是没问题的!但是iter却没有add方法。
下面说一下如何使用CopyOnWriteArrayList在遍历集合过程中修改元素。代码如下
List<String> list =new CopyOnWriteArrayList<String>();
  list.add("4");
  list.add("5");
  list.add("6");
  Iterator<String> iter = list.iterator();
  while(iter.hasNext()){
   String o = iter.next();
   System.out.println(o);
     list.remove(o);//or list.add("adf");等操作
  }
注:1.上面已经说过,CopyOnWriteArrayList操作是很消耗资源的,使用条件是,当集合中需要修改的元素数远小于集合大小时。
    2.因为CopyOnWriteArrayList在做迭代之前是做了一份“快照”,所以此时的iter是不可变的,也就是说如果在此遍历中调用iter.remove();会抛出异常:java.lang.UnsupportedOperationException。