java ArrayList.remove 和 Iterator.remove 區別
阿新 • • 發佈:2020-11-01
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