【问题标题】:altering collection over iteration在迭代中改变集合
【发布时间】:2012-02-20 01:05:25
【问题描述】:

在迭代中修改集合有时会产生异常,而有时则不会,为什么?

并发修改异常

       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

【问题讨论】:

    标签: java exception collections iteration


    【解决方案1】:

    来自JavaDocs for HashSet

    这个类的迭代器方法返回的迭代器是快速失败的:如果集合在迭代器创建后的任何时候被修改,除了通过迭代器自己的删除方法之外,迭代器抛出一个 ConcurrentModificationException。因此,面对并发修改,迭代器会快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。

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

    (突出显示是我的。)

    【讨论】:

      猜你喜欢
      • 2013-05-13
      • 2010-09-16
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      相关资源
      最近更新 更多