2013-09-30 65 views
0

当我们在程序上面运行时,只要修改了ArrayList就会得到java.util.ConcurrentModificationException。发生这种情况是因为ArrayList迭代器在设计上是快速失效的。这意味着一旦创建了迭代器,如果修改了ArrayList,则会抛出ConcurrentModificationExceptionCopyOnArrayList并发修改

public class ConcurrentListExample { 

    public void someMethod() { 
     List<String> list = new ArrayList<>(); 
     list.add("1"); 
     list.add("2"); 
     list.add("3"); 
     list.add("4"); 
     list.add("5"); 

     // get the iterator 
     Iterator<String> it = list.iterator(); 

     //manipulate list while iterating 
     while (it.hasNext()) { 
      String str = it.next(); 
      System.out.println(str); 
      if (str.equals("2")) { 
       list.remove("5"); 
      } 
      if (str.equals("3")) { 
       list.add("3 found"); 
      } 
      if(str.equals("4")) { 
       list.set(1, "4"); 
      } 
     } 
    } 
} 

,但如果我们采取Employee类:

public class Test { 
    public static void main(String[] args) { 
     List al = new ArrayList(); 
     Employee ee = new Employee(1, "anoj"); 
     Employee ee1 = new Employee(2, "hai"); 
     al.add(ee); 
     al.add(ee1); 
     Iterator it = al.iterator(); 
     while (it.hasNext()) { 
      Employee hh = (Employee)it.next(); 
      if (hh.getName().equals("anoj")) { 
       al.remove(0); 
       System.out.println(al); 
      } 
     } 
    } 
} 

我没有得到一个ConcurrentModificationException

+0

其正确的“你应该添加或删除的对象,而迭代。 – Sarma

+0

能否请您修正格式?很难看到发生了什么事情在这个代码。在第一个块,请降低缩进级别,使其不扬长而去屏幕的右侧。而在第二块,请加缩进合适的。这将使人们更容易阅读你的问题,并给出答案。 – yshavit

+3

什么是真正的问题在这里? –

回答

2

您不能使用迭代器同时修改和打印操作。它支持add()remove()

0

您应该通过迭代器添加或删除。

+1

它。删除()我得到java.lang.IllegalStateException – user2832497

1

它不会失败的第二次因为iterator回报anoj最后。因此hasNext返回false,并且next从不被调用,因此没有ConcurrentModificationException

只需将加入ee1上述ee,它会失败

注意这是内部实施ArrayList为1.为什么anoj最后被退回并2.为什么hasNext犯规扔CME。

+0

谢谢好exaplain – user2832497

1

并发修改异常气体检查缺陷,如果你删除ArrayList的倒数第二个元素它不会抱怨,但会跳过最后一个条目。

发生这种情况是因为它在检查并发修改之前检查它是否已经迭代了size()次。

+0

感谢非常有帮助。 – user2832497

0

我认为正确的解释是,从日javadocs of ConcurrentModificationExcetion这种提取物:

注意,快速失败行为不能得到保证,因为它是一般 来说,不可能作出任何硬性保证的 存在非同步并发修改。尽力而为,快速失败操作抛出 ConcurrentModificationException。因此, 将是错误的编写依赖于此异常 其正确性的程序:ConcurrentModificationException的应该只是 检测错误。

+0

确定可以为您提供链接。 – user2832497

+0

是的,我已经更新了该链接的答案。抱歉,我应该这么做过。 – Sage