你的位置:首页 > 软件开发 > Java > 遍历ArrayList时同时修改引发的问题

遍历ArrayList时同时修改引发的问题

发布时间:2015-11-13 21:00:05
看见一篇博客,没有写完整,于是增补了一下:博客原文:http://www.cnblogs.com/alipayhutu/archive/2012/08/11/2634073.html注:黄色字体为我添的CopyOnWriteArrayList,因何而存在?ArrayList的一个 ...

看见一篇博客,没有写完整,于是增补了一下:

博客原文:http://www.cnblogs.com/alipayhutu/archive/2012/08/11/2634073.html

注:黄色字体为我添的

CopyOnWriteArrayList,因何而存在?

ArrayList的一个线程安全的变体,其所有可变操作(addset 等)都是通过对底层数组进行一次新的复制来实现的,代价昂贵。

CopyOnWriteArrayList,是因”并发”而生。

 

【场景一】对于ArrayList,使用直接方式,一边遍历,一边删除,会报错。

 // 删除/修改元素
 for(String item : list){
   list.remove(item);
 }

 

 

遍历ArrayList时同时修改引发的问题

原因:foreach语法是通过Iterator来实现的,当遍历这个List的时候,会生成一个ArrayList.Itr对象,这个私有内部类实现了Iterator接口,也就是说上面这段代码与下面这段代码效果一样:

  Iterator it = list.iterator() ;

  while(it.hasNext()){

    String temp = it.next() ;

    list.remove(temp) ; 

  }

在ArrayList中有一变量记录的当前这个ArrayList被修改的次数,每当调用add/remove方法就会把该参数的值加一,当生成Iterator对象时该对象会记录当前状态ArrayList的修改次数,然后在每次调用it.next()时就会判断当前ArrayList修改次数是否和它记录的相同,如果不同就抛出异常。例如上面等效后的代码,当执行 it = list.iterator() ;时 it对象记录在执行这句代码之前list对象的修改次数,当第一次执行it.next()语句时不会发生异常,因为这时list还没有被修改,但是当第二次执行it.next()时list已经通过list.remove(temp)代码修改了其内部的修改次数变量,所以导致it对象记录的修改次数和list的修改次数不同,所以就抛出了异常。

只需记住的准则是: 使用Iterator遍历集合时是不能修改集合的。

遍历ArrayList时同时修改引发的问题 解决办法一:使用迭代器,一边遍历,一边删除,不会报错。

// 删除/修改元素 

原标题:遍历ArrayList时同时修改引发的问题

关键词:array

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录