简单理解,modCount 就是ArrayList中集合结构的修改次数【实际修改次数】,指的是新增、删除(不包括修改)操作。expectedModCount:是ArrayList中内部类Itr的一个成员变量,当我们调用iteroter()获取迭代器方法时,会创建内部类Itr的对象,并给其成员变量expectedModCount赋值为ArrayList对象成员变量的值modCount【预期修改次...
1.ConcurrentModificationException ConcurrentModificationException 出现在使用 ForEach遍历,迭代器遍历的同时,进行删除,增加出现的异常。平常使用的ArrayList, HashMap都有可能抛出这种异常,粗心的话,很容易犯这种错误,导致线上事故! 2. 情景列举 下面就ArrayList的一些使用场景,来讨论是否会抛出ConcurrentModificationException ...
Itr为ArrayList内部类,主要关注hasNext,next,checkForComodification方法 /*** An optimized version of AbstractList.Itr*/privateclassItrimplementsIterator<E>{intcursor;//index of next element to returnintlastRet = -1;//index of last element returned; -1 if no suchintexpectedModCount =modCount; Itr...
查看源码,modCount是在ArrayList的父类AbstractList中定义的,modCount记录list被修改的次数。在iterator和实现iterator的list中,进行next(),remove()、previous、set、add操作时,modCount的值被意外改变,将抛出异常ConcurrentModificationException。关于异常的解决,网上也有很多的方法,参考文末。 既然异常是在iterator和实现it...
源码分析:在 ArrayList 类中,remove() 方法会通过 Iterator 的 remove() 方法进行集合修改,调用时会更新 modCount,并且保证删除的元素不会影响剩余元素的顺序。 使用Iterator 删除元素:我们使用 Iterator 显式地迭代集合并删除元素 "b"。由于 Iterator 提供了 remove() 方法,这种做法可以安全地删除集合中的元素而不...
在Java开发过程中,使用iterator遍历集合的同时对集合进行修改就会出现java.util.ConcurrentModificationException异常,本文就以ArrayList为例去理解和解决这种异常。 二、单线程情况下问题分析及解决方案 2.1、抛出异常的代码 /** * ConcurrentModificationException复现方法一 ...
想要找出根本原因,直接查看ArrayList源码,原因是modCount不等于expectedModCount,则抛出ConcurrentModificationException异常。 List、Set、Map 都可以通过Iterator进行遍历,这里仅仅是通过List举例,在使用其他集合遍历时进行增删操作都需要留意是否会触发ConcurrentModificationException异常。
ArrayList中有三个迭代器相关的函数,返回两种迭代器实现,分别是ListIterator和Iterator。看名字就知道前者只能用于List的遍历,后者可用于所有Collection的遍历,对于for循环来说,使用的是后者。这点参考这两个页面。 http://beginnersbook.com/2014... https://stackoverflow.com/que... ...
ArrayList是一个很常用的集合类,底层是一个数组,只不过ArrayList封装了数组,实现了一些好用的方法例如add()方法,size()方法,get()方法等一系列的方法,并且实现了动态的扩容数组。 new ArrayList();创建了一个空数组,那么它的容量起始为0,为什么面试过程中很多人都说ArrayList的初始容量为10呢?原因在于当你第一次...
方法/步骤 1 既然大家都是点进来解决问题的,那么我首先先说下最便捷的解决方案吧,无论您是多线程报错,还是for循环中删除报错,只需用CopyOnWriteArrayList来替换普通的ArrayList,那就一定不会报错了。如下图所示:2 另外如果您是在for循环中使用arraylist自带的remove删除的话,有另外的解决方案,就是使用iterator的...