解決java刪除一個集合中的多個元素

在學習編程的過程中,我覺得不止要獲得課本的知識,更多的是解決問題的方法,面對新問題該怎麼解決,這樣我們才能走在最前方,我是達內的學員,感謝你對本博客的支持;(轉載於http://www.jvtarena.com/)
  這個問題的解決看上去非常簡單。

  我首先使用for each 語句進行刪除。

  for(SharedBoardSmsWrapper tmpSharedBoardSmsWrapper:source){

  for(BlackNameListModel tmpBlackNameListModel:blackNameList){

  if(tmpSharedBoardSmsWrapper.getSource().equals(tmpBlackNameListModel.getSource())){

  source.remove(tmpSharedBoardSmsWrapper);

  break;

  }

  }

  }

  非常簡單的問題!我暗笑,

  測試…

  令我意外的是,這段代碼居然拋出了異常

  java.util.ConcurrentModificationException。

  查看JDK6手冊

  public class ConcurrentModificationException

  extends RuntimeException

  當方法檢測到對象的併發修改,但不允許這種修改時,拋出此異常。

  例如,某個線程在 Collection 上進行迭代時,通常不允許另一個線性修改該 Collection。通常在這些情況下,迭代的結果是不確定的。如果檢測到這種行爲,一些迭代器實現(包括 JRE 提供的所有通用 collection 實現)可能選擇拋出此異常。執行該操作的迭代器稱爲快速失敗 迭代器,因爲迭代器很快就完全失敗,而不會冒着在將來某個時間任意發生不確定行爲的風險。

  注意,此異常不會始終指出對象已經由不同 線程併發修改。如果單線程發出違反對象協定的方法調用序列,則該對象可能拋出此異常。例如,如果線程使用快速失敗迭代器在 collection 上迭代時直接修改該 collection,則迭代器將拋出此異常。

  注意,迭代器的快速失敗行爲無法得到保證,因爲一般來說,不可能對是否出現不同步併發修改做出任何硬性保證。快速失敗操作會盡最大努力拋出 ConcurrentModificationException。因此,爲提高此類操作的正確性而編寫一個依賴於此異常的程序是錯誤的做法,正確做法是:ConcurrentModificationException 應該僅用於檢測 bug。

  Java中的For each實際上使用的是iterator進行處理的。而iterator是不允許集合在iterator使用期間刪除的。而我在for each時,從集合中刪除了一個元素,這導致了iterator拋出了ConcurrentModificationException。

  看來只有老老實實使用傳統的for循環了!

  for(int i=0;i

  SharedBoardSmsWrapper tmpSharedBoardSmsWrapper=source.get(i);
知識就是力量,別人學用知識來賺錢的成本低,在達內學習到編程是鑄造夢想的地方,如果你喜歡編程,這裏,有我們共同語言,共同的故事,共同的夢想!
(責任編輯:廣州達內)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章