這裡以arraylist為例介紹list實現類在迴圈過程刪除元素會遇到的問題。
乙個arraylist在迴圈過程中刪除,會不會出問題,為什麼?接下來給大家詳細解釋一下在這個過程中會出現的問題和原因及解決方法。
arraylist中的remove方法(注意arraylist中的remove有兩個同名方法,只是輸入引數不同,這裡看的是輸入引數是object的remove方法)是怎麼實現的:
public
boolean
remove
(object o)
}else
}return
false
;}
private
void
fastremove
(int index)
執行system.arraycopy方法,導致刪除元素時涉及到陣列元素的移動。
for each寫法是對實際的iterator、hasnext、next方法的簡寫,問題出在上文的fastremove中,可以看到第一行把modcount變數的值加1,但在arraylist返回的迭代器(該**在其父類abstractlist中)。
public iterator
iterator()
這裡返回的是abstractlist類內部的迭代器實現private class itr implements iterator,看這個類的next方法。
public e next()
catch
(indexoutofbound***ception e)
}
final
void
checkforcomodification()
這裡會做迭代器內部修改次數檢查,因為你上面的remove(object)方法修改了modcount的值,所以才會報出併發修改異常。要避免這種情況的出現,則在使用迭代器迭代時(顯式或for each的隱式)不要使用arraylist的remove,改用iterator的remove即可。
總結:錯誤原因都是arraylist集合中remove方法底層的原始碼中有乙個fastremove(index)方法,然後會有乙個modcount++的操作,然後在arratlist內部的迭代器中有乙個checkforcomodification操作,也就是檢查modcount是否改變,如果改變了,就丟擲併發修改錯誤。同樣的在for each增強for迴圈中,也是利用了arraylist自身的iterator迭代器,也是會出現這樣的錯誤。
注意,但是,通過iterator的remove方法又會遇到另乙個問題,具體list 迴圈遍歷中刪除元素問題二。
Python迴圈列表刪除元素問題
有人會遇到這種問題,遍歷列表,想刪除列表中的某幾個元素,執行後發現有些並沒有刪除到,比如以下 a 1,2,3,4,5,6 print a for i in a if i 3 or i 4 a.remove i print a 從 看主要就是想刪除a列表中的 3 4 元素,程式的結果是 1,2,3,4...
遍歷刪除List中的元素
使用iterator的方式可以順利刪除和遍歷 正確方式 public void iteratorremove system.out.println students 使用增強的for迴圈 錯誤方式 在迴圈過程中從list中刪除非基本資料型別以後,繼續迴圈list時會報concurrentmodifi...
List集合遍歷刪除元素
j a三種遍歷如何進行list的遍歷刪除 1 for迴圈 常見錯誤寫法 由於下標問題達不到想要效果 for int i 0 i應該改為 倒序操作避免下標問題 int size list.size for int i size 1 i 0 i 2 增強for迴圈 foreach迴圈 常見錯誤 會丟擲c...