zoukankan      html  css  js  c++  java
  • Java subList 抛ConcurrentModificationException的问题

    工作中的有些场景会用到subList,但是如果没有正确的使用,可能会出现以下场景的问题,请看例子:

    public static void main(String[] args) {   List<Integer> listOri = new ArrayList<>();   listOri.add(1);   listOri.add(2);   listOri.add(3);   listOri.add(4);   listOri.add(5);      List<Integer> listSub = listOri.subList(0, 3);   System.out.println("ori:" + listOri.size());   System.out.println("sub:" + listSub.size());   listSub.add(6);   System.out.println("after sub add");   System.out.println("ori:" + listOri.size());   System.out.println("sub:" + listSub.size());   listOri.add(7);   System.out.println("after ori add");   System.out.println("ori:" + listOri.size());   System.out.println("sub:" + listSub.size()); }

    代码中,我先是初始化了list,然后正常使用subList,然后分别对subList和list进行新增操作,并打印出他们的size,运行结果如下:

    ori:5
    sub:3
    after sub add
    ori:6
    sub:4
    after ori add
    ori:7
    Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1169)
    at java.util.ArrayList$SubList.size(ArrayList.java:998)
    at com.vivo.exappstore.api.service.impl.SearchServiceImpl.main(SearchServiceImpl.java:228)

    解释一下原因:

    首先subList的add等操作是对原始list进行操作,并把操作后的modCount赋给自己

    public void add(int index, E e) {
      rangeCheckForAdd(index);
      checkForComodification();
      parent.add(parentOffset + index, e);
      this.modCount = parent.modCount;
      this.size++;
    }

    其次subList获取size时会对modCount做校验,并且校验的是原始list和自己是否相等

    public int size() {
      checkForComodification();
      return size;
    }

    private void checkForComodification() {
      if (ArrayList.this.modCount != this.modCount)
      throw new ConcurrentModificationException();
    }

    因此当对原始的list进行add的时候,subList的modCount感知不到,会导致subList的checkForComodification失败

    生成subList后对原始list进行增删改需要小心

      

  • 相关阅读:
    URL 转化为 Dictionary 字典
    ios 续费 问题 冰山一角
    1.node.js在遇到“循环+异步”时的注意事项
    1.【微信小程序经验】各类图表相关组件+Demo源码(折线图,柱状图,K线,分时图)
    10. 启动WPS for Linux后,出现提示"系统缺失字体"
    8.Postman中发送请求被拦截(证书问题)
    20.mysql查看sql执行时间
    19.Mysql索引结构及常见索引的区别
    18.mysql优化(三)–explain分析sql语句执行效率
    9.安装的第一个Linux系统 -Linux Mint 18.1 cinnamon
  • 原文地址:https://www.cnblogs.com/turn2i/p/10576682.html
Copyright © 2011-2022 走看看