连初级都算不上的代码小白 2023-11-05 17:00 采纳率: 52.4%
浏览 12
已结题

Java集合的remove异常

ArrayList<Integer>list=new ArrayList<>();//与变量名无关
//省略add方法节省空间
for(Integer a:list){
    if(a==30){
        list.remove(a);
    }
}
//这段代码就没有异常
ArrayList<String>arrayList=new ArrayList<>();
for(String s:arrayList){
    if("3".equals(s)){
        arrayList.remove(s);
    } 
}

为什么同样的形式上面会报并发修改异常、而下面的就不会
反编译源码形式也差不多

        Iterator var2 = arrayList.iterator();

while(var2.hasNext()) {
            String s = (String)var2.next();
            if (s == "3") {
                arrayList.remove(s);
            }
        }


 Iterator var2 = arrayList.iterator();

        while(var2.hasNext()) {
            Integer a = (Integer)var2.next();
            if (a == 30) {
                arrayList.remove(a);
            }
        }
  • 写回答

3条回答 默认 最新

  • 关注
    
    ArrayList<String>arrayList=new ArrayList<>();
    for(String s:arrayList){}
    
    

    这一段代码反编译后

    ArrayList<String> arrayList = new ArrayList();
    
    String var3;
    for(Iterator var2 = arrayList.iterator(); var2.hasNext(); var3 = (String)var2.next()) {
    }
    

    看上面,一开始调用了next方法。找到next原码如下

    
     public E next() {
                checkForComodification();//
                int i = cursor;
                if (i >= size)
                    throw new NoSuchElementException();
                Object[] elementData = ArrayList.this.elementData;
                if (i >= elementData.length)
                    throw new ConcurrentModificationException();
                cursor = i + 1;
                return (E) elementData[lastRet = i];
            }
    

    关注标注释处、ArrayList的remove不会更正修改次数、故报异常===》并发访问异常。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 已采纳回答 11月6日
  • 创建了问题 11月5日