2017-08-01 38 views
4
ArrayList<Integer> targets = new ArrayList<Integer>(); 
targets.add(2); 
targets.add(2); 

for (Integer testInt : targets) 
{ 
     targets.add(1); 
} 

我得到一個concurrentModificationException,但與正常的循環。我沒有得到任何例外。 在正常的for循環,如: -爲什麼在foreach方法上同時修改,但不在for循環

for(int i=0;i<target.size();i++) 
{ 
    System.out.println(target.get(i)); 
    target.add(22); //no exception 
    target.remove(2) // no exception 
} 
+0

如何serviceQueue和目標相關的....我沒有看到現貨... –

+0

我剛纔編輯的問題 – shiv

+2

如果在增強型for循環期間修改ArrayList後面的隱式interator會拋出異常。閱讀這裏:https://stackoverflow.com/questions/9806421/concurrentmodificationexception-when-adding-inside-a-foreach-loop-in-arraylist 通常的for循環工作不同,你直接訪問列表和它的大小,而不是通過interator。 – huellif

回答

3

ForEach循環不會在您的收藏直接循環。它使用你的集合的迭代器。你可以在你的集合實現中看到迭代器。

Arraylist source code

735 
736  public Iterator<E> More ...iterator() { 
737   return new Itr(); 
738  } 


An optimized version of AbstractList.Itr 
742 
743  private class More ...Itr implements Iterator<E> { 
744   int cursor;  // index of next element to return 

而且你的foreach循環等於

for(Iterator<Integer> i = targets.iterator(); i.hasNext();) { 
    Integer element = i.next(); 
    //To do 
} 

所以,如果你在這裏做任何操作,並在修改收集的同時,引擎蓋下的迭代器有混淆視聽,拋出異常。

JLS

List<? extends Integer> l = ... 
for (float i : l) ... 

將被翻譯成:

for (Iterator<Integer> #i = l.iterator(); #i.hasNext();) { 
    float #i0 = (Integer)#i.next(); 
    ... 
+0

在JLS中是正確的,但是我們可以看到源代碼, – shiv