1、使用foreach的話,在刪除完元素之後,接著遍歷就會拋異常。如下圖所示:
因為foreach實際的實現原理是迭代器的方式去遍歷,會去呼叫itr物件的hasnext()和next()方法。在該類的next和remove方法中,都會去呼叫checkforcomodification()方法,該方法內部就做了一件事,判斷modcount(實際修改的次數)和expectedmodcount(期望修改的次數)是否一致。
因此可以看出,在foreach中去執行list.remove(object o)方法時,呼叫到了fastremove(int index)對list物件的modcount是進行了修改的,但是list物件的迭代器中的exceptedmodcount並沒有改動,所以此時會丟擲concurrentmodificationexception異常
2、使用普通的for迴圈,不會拋異常,但是接著遍歷所得到的資料可能是不正確的,因為在刪除元素後,沒有修改對應的下標。
因為在list中的remove方法邏輯是將目標元素之後的元素整體向前移動乙個位置,然後將最後乙個位置置為null,size-1.
3、迭代器的方式:list內部實現了iterator介面,通過它可以得到乙個list的iterator物件。使用該方式可以順利地刪除和遍歷集合中的元素,推薦使用。注意這裡使用的是迭代器iterator的remove()方法。在該方法的remove中,每次都會保持modcount和exceptedmodcount的一致性。
總結:推薦使用迭代器的方式刪除元素。
List集合刪除元素的正確姿態
一 集合元素遍歷 在遍歷集合的時候,我們可能會根據業務的需要而需要排除集合的一些元素,通常我們遍歷list集合常用的有下列3種方式 1.普通for迴圈 for int i 0 isize i 2.增強for for int i list 3.迭代器 iterator iterator list.it...
List集合中元素的問題
檢視 bookbeans 是原始集合,memberbeans 是根據bookbeans集合 是把集合元素插入進來生成的,adapter中元素是memberbeans 所以當修改了memberbeans集合中元素屬性的時候,bookbeans集合元素屬性跟隨改變,adapter在更新 的時候也會看到 ...
刪除list中元素的問題
先來看乙個例子 lst x for x in xrange 10 print lst for x in lst lst.remove x print lst 結果為 0,1,2,3,4,5,6,7,8,9 1,3,5,7,9 為啥沒有被刪除乾淨呢?檢視python源 python 2.7.5 obj...