Java 在迭代中改变集合

Java 在迭代中改变集合,java,exception,collections,iteration,Java,Exception,Collections,Iteration,在迭代过程中修改集合有时会产生异常,但有时不会,为什么 并发修改异常 Set<Integer> j = new HashSet<Integer>(); j.add(23); j.add(45); j.add(64); int c=0; for(Integer k: j) { if(c++==0) { j.remov

在迭代过程中修改集合有时会产生异常,但有时不会,为什么

并发修改异常

       Set<Integer> j = new HashSet<Integer>();
       j.add(23);
       j.add(45);
       j.add(64);
       int c=0;
       for(Integer k: j)
       {
         if(c++==0)
         {
             j.remove(45);
         }
       }
      System.out.println(j); // concurrent modification exception

     <hr>

 //works without exception
     Set<Integer> j = new HashSet<Integer>();
       j.add(23);
       j.add(45);
       j.add(64);
       int c=0;
    for(Integer k: j)
    {
       if(k==45)
       {
           j.remove(45);
       }
    }
    System.out.println(j);//works without exception
Set j=new HashSet();
j、 增加(23);
j、 增加(45);
j、 增加(64);
int c=0;
for(整数k:j)
{
如果(c++==0)
{
j、 移除(45);
}
}
系统输出打印Ln(j);//并发修改异常

//毫无例外 Set j=新的HashSet(); j、 增加(23); j、 增加(45); j、 增加(64); int c=0; for(整数k:j) { 如果(k==45) { j、 移除(45); } } 系统输出println(j)//毫无例外
来自:

这个类的迭代器方法返回的迭代器是快速失败的:如果在迭代器创建后的任何时候,以任何方式(除了通过迭代器自己的remove方法)修改集合,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不是在将来的不确定时间冒着任意、不确定行为的风险

请注意,无法保证迭代器的快速失效行为,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬保证。快速失败迭代器会尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测bug

(突出显示是我的。)

来自:

这个类的迭代器方法返回的迭代器是快速失败的:如果在迭代器创建后的任何时候,以任何方式(除了通过迭代器自己的remove方法)修改集合,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不是在将来的不确定时间冒着任意、不确定行为的风险

请注意,无法保证迭代器的快速失效行为,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬保证。快速失败迭代器会尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测bug

(突出显示的是我的。)