再次踩bug:遍历删除list(java.util.ConcurrentModificationException)

再次踩bug:遍历删除list(java.util.ConcurrentModificationException)

使用

List<Long> list = new ArrayList<Long>();
for(Long l : list){
    if(l == 5){
        list.remove(l);
    }
}    
for(int i=0; i<list.size(); i++){
    if(l == 5){
       list.remove(l);
    }    
}

上面两种遍历方法都会出错,

第一种循环,增加for循环,当有再次删除时,会出现java.util.ConcurrentModificationException

第二种循环,一边删除size会变小,list的位置也会改变,就算不出错,也会删除错位置(比如你循环到第2个元素的时候你把它删了, 接下来你去访问第3个元素,实际上访问到的是原先的第4个元素。

后来查询后得知,要使用iterator删除list

方法如下

List<Long> list = new ArrayList<Long>();
Iterator<Long> it = list.iterator();
while(it.hasNext){
    if(it.next() == 5){
        it.remove();//注意此处不能用list.remove(it.next());
    }
}

 以前自已写过一个简单的iterator的简单实现,地址在这

原文地址:https://www.cnblogs.com/baron89/p/3593550.html