zoukankan      html  css  js  c++  java
  • 为什么ArrayList remove报错

    不报错

    List<String> userNames = new ArrayList<String>() {{
        add("Hollis");
        add("hollis");
        add("HollisChuang");
        add("H");
    }};
    
    for (int i = 0; i < userNames.size(); i++) { // 每一次循环都会重新计算当前的size, 从而i不会越界
        if (userNames.get(i).equals("Hollis")) {
            userNames.remove(i);
        }
    }
    
    System.out.println(userNames);

    会报错 ConcurrentModificationException

    List<String> userNames = new ArrayList<String>() {{
        add("Hollis");
        add("hollis");
        add("HollisChuang");
        add("H");
    }};
    
    for (String userName : userNames) {
        if (userName.equals("Hollis")) {
            userNames.remove(userName);
        }
    }
    
    System.out.println(userNames);

     通过查看源码发现,引起异常是因为modCount和expectModCount不一致导致的

    final void checkForComodification() {
        // modCount 和 expectedModCount 不同导致的
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
        }
    }

    通过remove方法的源码发现 remove 调用 fastremove, fastremove中只是修改了modCount, 造成了两者的不一致.

    private void fastRemove(int index) {
        // 只是修改了modCount
        modCount++;
        // omit code
        elementData[--size] = null; // clear to let GC do its work
    }
  • 相关阅读:
    项目开发基础概念
    django 对接elasticsearch实现全文检索
    win10安装docker
    Mac VMware Fusion 中修改 centos7 虚拟机的磁盘空间、扩容
    CentOS 7下 YUM 本地仓库的搭建
    mac与虚拟机传输文件
    mac和windows快速锁定电脑
    rpm -qa详解
    虚拟机安装centos6
    mac与iPhone互传文件
  • 原文地址:https://www.cnblogs.com/webglcn/p/10616994.html
Copyright © 2011-2022 走看看