我是靠谱客的博主 帅气果汁,最近开发中收集的这篇文章主要介绍关于ArrayList与CopyOnWriteArrayList的遍历remove操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天在测试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操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部