1. Arraylist remove陷阱

190 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

问题

ArrayList是我们经常在代码中使用的集合类,但是ArrayList在执行remove方法时会出现ConcurrentModificationException。针对这个问题进行代码分析。

\

源码分析:

\

\

\

说明:思想是ArrayList的删除方法,将指定位置元素删除,然后将当前位置后面的元素向前拷贝的方式移动。但是注意一点细节,modCount++这步操作,将ArrayList的修改次数加1。而后面遍历时发现是通过使用这个字段来判断,当前的集合类是否被并发修改。

ArrayList中Iterator迭代器的实现

\

说明:
① 在初始化Itr时expectedModCount = modCount = 8 。
② 在执行next方法的第一步先进行了checkForComodification方法的检查,因为我们之前进行了remove操作,那么modCount数值减一,实际modCount = 7 。
③ modCount 数值和expectedModCount 数值不相等,抛出ConcurrentModificationException异常。

正确写法:

使用Itr自身提供的remove方法:

说明:使用Itr提供的remove方法,可以发现expectedModCount是随着modCount变化而发生变化的,所以是不需要考虑modCount修改次数不一致的问题