`
fxly0401
  • 浏览: 144122 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)通过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。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics