1. 程式人生 > 實用技巧 >java ArrayList.remove 和 Iterator.remove 區別

java ArrayList.remove 和 Iterator.remove 區別

foreach 遍歷 ArrayList 的時候 用ArrayList.remove 做刪除操作會異常的

直接用Iterator 遍歷Iterator.remove 是不會異常的

眾所周知,foreach 本質上就是Iterator 的語法糖 那麼為什麼會出現這種情況呢?

ArrayList 的Iterator 返回的是 Itr 類的例項

public Iterator<E> iterator() {
return new Itr();
}


例項化Itr的時候 記錄了一個變數
int expectedModCount =modCount;

其中 modCount 是ArrayList的屬性 expectedModCount 是Itr的屬性
ArrayList.add   ArrayList.remove 等操作  都執行了 modCount++; 操作
就是說
expectedModCount 記錄的是 new Itr 之前的ArrayList修改操作次數

至於之後做的 modCount++; 則不知道

然鵝,每次Itr.next() 操作中 都判斷了
if (modCount != expectedModCount)
throw new ConcurrentModificationException();

哈哈 找到foreach報錯原因了吧


那麼 為什麼 Iterator.remove 不報錯呢? 實際上
Iterator.remove內部也呼叫了ArrayList.remove 只不過後面又執行了 expectedModCount=modCount