为了账号安全,请及时绑定邮箱和手机立即绑定

在迭代和从ArrayList中删除元素时,如何避免java.util.Concurrent

在迭代和从ArrayList中删除元素时,如何避免java.util.Concurrent

万千封印 2019-08-26 15:50:05
在迭代和从ArrayList中删除元素时,如何避免java.util.ConcurrentModificationException我有一个我想迭代的ArrayList。迭代它时,我必须同时删除元素。显然这会抛出一个java.util.ConcurrentModificationException。处理此问题的最佳做法是什么?我应该先克隆列表吗?我删除不在循环本身但是代码的另一部分的元素。我的代码看起来像这样:public class Test() {     private ArrayList<A> abc = new ArrayList<A>();     public void doStuff() {         for (A a : abc)          a.doSomething();     }     public void removeA(A a) {         abc.remove(a);     }}a.doSomething可能打电话Test.removeA();
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

两种选择:

  • 创建要删除的值列表,在循环中添加该列表,然后originalList.removeAll(valuesToRemove)在结尾处调用

  • remove()在迭代器本身上使用该方法。请注意,这意味着您无法使用增强型for循环。

作为第二个选项的示例,从列表中删除长度大于5的任何字符串:

List<String> list = new ArrayList<String>();...for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
    String value = iterator.next();
    if (value.length() > 5) {
        iterator.remove();
    }}


查看完整回答
反对 回复 2019-08-26
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

来自ArrayList的JavaDocs

此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。


查看完整回答
反对 回复 2019-08-26
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

您试图从高级“for循环”中的列表中删除值,这是不可能的,即使您应用任何技巧(您在代码中执行)。更好的方法是将迭代器级别编码为其他建议。

我想知道人们怎么没有建议传统的for循环方法。

for( int i = 0; i < lStringList.size(); i++ ){
    String lValue = lStringList.get( i );
    if(lValue.equals("_Not_Required"))
    {
         lStringList.remove(lValue);
         i--; 
    }  }

这也有效。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 377 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号