看见一篇博客,没有写完整,于是增补了一下:博客原文: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的一个线程安全的变体,其所有可变操作(add、set 等)都是通过对底层数组进行一次新的复制来实现的,代价昂贵。
CopyOnWriteArrayList,是因”并发”而生。
【场景一】对于ArrayList,使用直接方式,一边遍历,一边删除,会报错。
// 删除/修改元素
for(String item : list){
list.remove(item);
}
原因: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时同时修改引发的问题
关键词:array
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。