1. 程式人生 > >再難跪著也要走下去,因為我想看看這條路的盡頭是什麼,

再難跪著也要走下去,因為我想看看這條路的盡頭是什麼,

知乎上有一個人回答這個問題回答的很好,特附上鍊接:

為什麼不能在ArrayList的For-Each迴圈中刪除元素 - 南山伐木的文章 - 知乎http://zhuanlan.zhihu.com/p/25744271

下面是我的理解:

a. For-Each遍歷是基於ArrayList內部的迭代器的hasNext()和next()方法來實現的併發修改異常,所以在使用For-Each遍歷時不能用ArrayList的remove方法,而是用iterator的方法.next()方法會先判斷一下iterator裡面的expectedModCount 和list的modCount是否相等,所以如果在用for-each遍歷,刪除用的是arraylist本身的remove方法,它不會去修改iterator裡面的expectedModCount ,所以在比較是就不會相等,丟擲併發異常。如果刪除使用的是iterator裡面的remove方法,他會去修改expectedModCount ,就不會報錯。所以如果你用for-each,而僅僅刪除了集合中的倒數第2個,刪除之後再呼叫hasNext()方法時由於集合的大小發生了變化,後面沒有元素了,他就直接退出了,所以這種情況下是不會報異常的。

b. 如果是用for –index遍歷,設計到刪除操作要從後往前刪,如果從前往後遍歷,刪除的元素時集合的大小會發生變化,刪除的元素

的後一個元素不會被遍歷到,會發生遺漏

for-each的底層原理,附上鍊接,重點是裡面對於for-each的反編譯

                            http://www.hollischuang.com/archives/1776