概述
今天在测试list的遍历删除的时候突然发现,有报错
1、当List中有五个对象的时候,使用CopyOnWriteArrayList实例化
我们会发现当使用foreach方法删除的时候是没有问题的,但是会发现,当使用迭代方法 iterator.remove() 删除的时候就会报错
2、使用ArrayList实例化对象
这个和我们第一个的结果正好相反,使用Iterator这个方法是可以直接删除的,而使用foreach方法是会报错
3、首先分析Iterator这个方法
我们可以看到第一种返回的是一个UnsupportedOperationException这个错,说明是不支持该操作的,那么我们就需要去看看CopyOnWriterArrayList的源代码
当你直接跳转到CopyOnWriteArrayList中你会发现CopyOnWriteArrayList并没有实现Iterator,但是我们可以在下方发现
有内部类实现了ListIterator,而ListIterator是实现了Iterator的,所以,我们在迭代的时候是直接跳转到这个内部类中的,然后我们会发现在这个内部类中有一个remove方法,直接返回了UnsupportedOperationException,也就是最起码1.8的jdk是不支持CopyOnWriteArrayList进行迭代删除的
但是我们再看看ArrayList的源码的时候会发现,其中有一个内部类直接实现了Iterator
而且其中重写了remove方法,当每次删除操作之后,会重新将modCount赋值给expectedModCount,这样的话,当我们每次remove之前调用checkForComdification这个方法的时候,就不会抛出第二种情况的异常了,也就是ConcurrentModificationException
4、分析foreach这个方法,也就是list.remove()
我们可以先看一下ArrayList的错误,我们会发现,我们并没有使用到Itr,但是错误中首先是用的Itr中的checkForComodification这个方法
在看了其他大佬的博客之后我发现,原来foreach其实是相当于
那么大家就能理解了吧,当使用ArrayList进行remove操作的时候也是会进行checkForComodification判断modCount以及expectedModCount的数值的,但是因为当我们删除完成之后,并没有同步两个数据,所以会报错,除非我们自己重写方法,将数据同步,这样就可以了
然后我们在看看CopyOnWriteArrayList的remove方法
我们会发现,系统直接生成新数组newElements,而且,因为CopyOnWriteArrayList并没有Iterator.remove这个方法,所以并不会判断修改次数与预计修改次数是否相同,所以不会报错
关于CopyOnWriteArrayList的优缺点我会在继续研究的
最后
以上就是帅气果汁为你收集整理的关于ArrayList与CopyOnWriteArrayList的遍历remove操作的全部内容,希望文章能够帮你解决关于ArrayList与CopyOnWriteArrayList的遍历remove操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复