先说说使用for each 的list遍历,假设list是字符串集合
for(String str:list){
....
}
假如需求来了,要求删除集合中特定的字符串,你也许会这么做
for(String str:list){
...
if(str.equal("")){
list.remove(str);
}
...
}
这种需求很常见,那么我们运行一下
运行结果
看到没,报了java.util.ConcurrentModificationException的异常。
我们来分析一下,问题其实出在for each的遍历上,通过反编译我们很清楚for each对list的遍历其实如下
Iterator<String > iterator = list.iterator();
while(iterator.hasNext()){
String str = iterator.next();
}
没错,是用的迭代器。
加入在循环体中使用list.remove 的方法,那么list会减少一项,但是itertor的数据并不会减少。。
那么你会问,既然不影响itertor,那么更不会报错咯?
狗血的是:
迭代器每次next获取数据时,都会判断自身是否和list相同,如果不同,抛出java.util.ConcurrentModificationException异常,现在你知道是什么原因了吧?😄
那么怎么解决上面需求,其实itertor也有remove的方法,具体实现你们自己去敲代码,我先睡觉了,😄
网友评论