zoukankan      html  css  js  c++  java
  • 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 









  • 相关阅读:
    mysql删选某列重复值
    apache伪静态
    nginx的伪静态
    如何对数据库进行优化
    ci的优缺点
    memcache状态说明
    sql中扩展插入语法
    若给个 个人收款的二维码,如何测试?
    安装自动化测试工具selenium
    PHP 线上项目 无法操作
  • 原文地址:https://www.cnblogs.com/dint/p/13909251.html
Copyright © 2011-2022 走看看