1. 程式人生 > >關於集合操作產生併發修改異常的問題

關於集合操作產生併發修改異常的問題

       這個異常產生的原因是,迭代器依賴於集合而存在,在判斷成功後,集合中添加了新的元素,而迭代器並不知道,所有就報錯了。其實這個問題說的是:迭代器遍歷集合中的元素的時候,不要使用集合物件去修改集合中的元素。
    翻看ArrayList原始碼和iterator()方法的具體實現,可以發現ArrayList繼承於集合抽象類有一個成員變數modCount,在每次對元素進行增刪改時,相應方法會將modCount++。而進行遍歷iterator的next方法中首先會呼叫checkForComodification()方法,這個方法會對modCount和expectedModCount進行比較,expectedModCount是iterator的成員變數,一開始被賦值為modCount,兩者不等就會丟擲併發修改的異常。
  解決方案:迭代器遍歷的時候,可以通過迭代器修改集合中的元素,iterator類中也有修改元素的方法,並在修改完成後重新將modCount賦值給expectedModCount,之後進行next遍歷檢查就不會再報異常。

或者,我們可以在集合遍歷的時候,通過集合物件修改集合中的元素,這樣也不會進行期望修改次數與實際修改次數的比較,因此不會丟擲異常。