關於ConcurrentModificationException異常

在使用加強 for 循環遍歷ArrayList,同時刪除某元素時,遇到ConcurrentModificationException異常html

for(Person p : personList)
{
  if(id.equals(p.getId))
  {
    personList.remove(p);
    }    
}

由於使用加強for循環的時候,內部原理是調用了iterator 實現。因此比較簡單的解釋是:java

Iterator被建立的時候,創建了一個內存索引表(單鏈表),這 個索引表指向原來的對象,當原來的對象數量改變的時候,這個索引表的內容沒有同步改變,因此當索引指針往下移動的時候,便找不到要迭代的對象,因而產生錯 誤。List、Set等是動態的,可變對象數量的數據結構,可是Iterator則是單向不可變,只能順序讀取,不能逆序操做的數據結構,當 Iterator指向的原始數據發生變化時,Iterator本身就迷失了方向。
如何才能知足需求呢,須要再定義一個List,用來保存須要刪除的對象:
List delList = new ArrayList();
最後只須要調用集合的personList.removeAll(Collection con)方法就能夠了。數據結構

(來自:http://www.cnblogs.com/frankliiu-java/articles/1759460.htmlspa

也經過用指定下標的方式來移除元素,此時不會拋出異常。指針

所以,使用加強for循環遍歷 list 的時候,和使用迭代器遍歷的時候同樣,不能刪除元素,同時不能獲取下標。但能夠手動添加遊標,而後調用personList.remove(index)方法解決。htm

    int index = 0;
    for (Person p : personList)
    {
	if (p.getId().equals(targetId))
	{
		personList.remove(index);
	}

	index ++;
    }
相關文章
相關標籤/搜索