2010-05-17 26 views

回答

8

該代碼將與大多數集合斷開 - 除了一些集合(如java.util.concurrent中的集合)之外,不支持在迭代集合的同時修改集合。

有幾個選項:

  • 獲取和使用迭代器明確(調用iterator()的集合),而不是增強的for循環,並調用iterator.remove()刪除項目
  • 使用一個普通的for循環,或者向前移動和去除後退一步或從端
  • 向後移動維護項的單獨列表,以除去,然後除去它們後迭代
+1

這可能是值得一提的是這個「功能」被稱爲快速失敗的唯一安全的方法來修改的集合。閱讀相關的Javadoc時,它應該有助於瀏覽。 – mindas 2010-05-17 08:36:59

0

絕對不建議在迭代時篡改集合。我不確定Java是否允許它;它可能會拋出異常。我知道C#會...

0

迭代器將失敗,併發出ConcurrentModificationException。這就是收集框架的設計。

1
List<Integer> al = new ArrayList<Integer>(); 
for(int i=0;i<10;i++){ 
    al.add(i); 
} 
for(Integer x:al){ 
    al.remove(x); 
    System.out.println(al); 
} 

那麼,這個問題很有趣,所以我在我的系統中試過,這是我得到的。

Exception in thread "main" java.util.ConcurrentModificationException 
    at java.util.AbstractList$Itr.checkForComodification(Unknown Source) 
    at java.util.AbstractList$Itr.next(Unknown Source) 
    at test.Main.main(Main.java:17) 
3

就以迭代看看節上collection interface tutorial

使用iterator而不是換每次當你需要刪除當前元素構造。 for-each構造隱藏迭代器,所以你不能調用remove。因此,for-each構造不適用於過濾。

注意Iterator.remove是在迭代