2014-01-30 42 views
2

我知道failfast迭代器在尽力而为的基础上检查ConcurrentModificationException。为什么不会像hasnext或hasPrevious方法检查ConcurrentModificationException并抛出它?为什么没有hasnext,hasprevious等Iterator或ListIterator方法检查ConcurrentModificationException

下面的代码可以很好地用于精确的原因,这些方法都没有检查CME虽然已经结构体改

public static void main(String[] args) { 
     // TODO Auto-generated method stub 


     List<String> lilong = new ArrayList<String>(); 
     lilong.add("Queen"); 
     for(Iterator<String> iter =lilong.iterator();iter.hasNext();) 
     { 
      System.out.println(iter.next()); 
      lilong.add("King"); 
      lilong.remove(0); 
      lilong.add("Star"); 
      lilong.remove(0); 
      lilong.add("Sun"); 
      lilong.remove(0); 
      lilong.add("Polar Bear"); 
      lilong.clear(); 

      lilong.add("There you go"); 

     } 
     System.out.println("size="+ lilong.size()+"##element##"+lilong.iterator().next()); 
    } 
+0

我在这里没有看到任何迭代器。 – Maroun

+1

迭代器隐藏在for-each语句中。 – Kayaman

+0

@Kayaman我的意思是['iterator()'](http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#iterator())。每个循环的 – Maroun

回答

1

hasNext对于ArrayList的迭代器没有检查修改,它只看大小。

如果您在列表中添加一个元素,则会进入第二次迭代,然后next将按预期失败。

至于为什么它以这种方式实现... +1你的问题。

+0

是的,但它可以使用next()和remove()方法使用的方法进行检查: - final void checkForComodification(){ if(modCount!= expectedModCount) throw new ConcurrentModificationException(); } 这是从remove()和next()方法调用的,但不是来自hasnext()方法 –

+0

“是的,但它可以检查”。真正。但事实并非如此。 – Thilo

1

编辑:删除废话负荷

所以问题是:为什么hasNext()检查并发修改,就像Iterator的其他方法一样。

如果我打赌猜,hasNext()没有太多的用处,除非有一个next()之后。所以不要在2个地方进行支票,而只是在next()

+0

是的..那个点。如果它检查了hasNext()方法的并发修改异常,它对于这种情况肯定也会有好处。迭代器检查CME只为next()和remove() –

+0

@AbhinavKumar我不确定你的代码试图显示什么。即使hasNext()检查了CME,示例代码仍然会像现在一样运行。 – Kayaman

+0

我需要替换我的代码迭代器构造,只有那么我会更清晰 –

相关问题