ArrayList的遍历删除问题

问题一:对于ArrayList,使用foreach,一边遍历,一边删除/添加,会报异常。

List<String> list = new ArrayList<String>();

list.add("aaa1123");

list.add("aaabbb");

list.add("aaa11ddd23");

list.add("aaa1123dddd");

for(String str : list){

      if(str.contains("b")){

               list.remove(str);

               //list.add("xxx");
      }

}

Exception in thread "main" java.util.ConcurrentModificationException

at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)

at java.util.AbstractList$Itr.next(AbstractList.java:343)

at com.icss.test.Test.main(Test.java:61)

解决方法如下:

方案一:使用迭代器,一边遍历,一边删除。
Iterator<String> iterator = list.iterator();

while(iterator.hasNext()){

       String s = iterator.next();

       if(s.contains("b")){

                terator.remove();

        }

}

 

方案二:使用CopyOnWriteArrayList使用foreach,一边遍历,一边删除/添加

CopyOnWriteArrayList<String> listCopy = new CopyOnWriteArrayList<String>();

listCopy.addAll(list);

for(String str : listCopy){

        if(str.contains("b")){

                  listCopy.remove(str);

                  //listCopy.add(“xxx”);

         }

}

 

方案三:使用另一个集合将要删除的集合项保存下来,最后调用removeAll

List<String> listTemp = new ArrayList<String>();

for(String str : list){

            if(str.contains("b")){

                     listTemp.add(str);

            }

}

list.removeAll(listTemp);

 

方案四:ArryList进行for循环删除

for(int i = list.size() - 1; i >= 0; i--){

          String s = list.get(i);

          if(s.contains("1")){

                   list.remove(s);

          }

}

引起异常的原因如下:

ArrayList结构改变包括:向ArrayList添加、删除元素,或者明确的手动修改数组大小。如果仅仅是给一个元素赋值,不属于结构的改变。

而当ArrayList结构改变则引起以下问题:

可能导致IteratorConcurrentModificationException异常。

   注意:当ArrayList使用了iterator()方法产生自身对应的Iterator后,只能使用Iterator自身的removeadd方法来修改ArrayList的结构,其它的修改都会引起ConcurrentModificationException异常,如ArrayList.add(E e)ArrayList.remove(int index)等。

ArrayList使用AbstractList.modCount(初始的默认值为0)作为结构改变的标示。在ArrayList中,凡是会引起ArrayList结构变化的方法,都会修改modCount(modCount++),以区别是否修改了ArrayList的结构。

如果是对ArrayListIterator做修改,在Iterator中会重置expectedModCount=modCount,这样就可以保证在生成Iterator后,只能由Iterator来修改对应的ArrayList的结构。如果此时,ArrayList修改了自身的结构,那么expectedModCoun==modCount将会返回false,从而Iterator会抛出ConcurrentModificationException异常。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值