2014-01-30 75 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

我需要替換我的代碼迭代器構造,只有那麼我會更清晰 –

相關問題