ArrayList 可不可以在循环时候调用remove()方法
程序员文章站
2022-05-03 23:50:27
1 正向循环删除的时候由于删除完一个元素后会进行元素移动,如果有一样的元素,会漏删第二个一样的元素。for循环正向删除,会遗漏连续重复的元素。2 反向循环删除不会出现漏删情况,并且多线程安全。总结:反向遍历删除,没有问题(单线程+多线程)。3 使用迭代器删除,如果调用List的remove()方法,会抛出异常,通过迭代器的源码解析,发现是由于删除后ModCount会增加 但expectedModCount不会增加这样在下边方法判断中就会由于这两个参数不相等而抛出异常。Iterator调用Array....
- 1 正向循环删除的时候由于删除完一个元素后会进行元素移动,如果有一样的元素,会漏删第二个一样的元素。for循环正向删除,会遗漏连续重复的元素。
-
2 反向循环删除不会出现漏删情况,并且多线程安全。
总结:反向遍历删除,没有问题(单线程+多线程)。 -
3 使用迭代器删除,如果调用List的remove()方法,会抛出异常,通过迭代器的源码解析,发现是由于删除后ModCount会增加 但expectedModCount不会增加这样在下边方法判断中就会由于这两个参数不相等而抛出异常。
Iterator调用ArrayList的删除方法报错**,Iterator调用迭代器自己的删除方法,单线程不会报错,多线程会报错**。 - 4 使用foreach循环删除会报错,是因为这些集合都实现了Iterable接口,改接口定义了iterator迭代器的产生方法,并且forEach就是通过Iterable接口在序列中进行移动,也就是说:在编译的时候,编译器会自动堆for这个关键字的使用转化为目标的迭代器的使用,那么就是3中说的一样了。
本文地址:https://blog.csdn.net/fristjcjdncg/article/details/108033005
下一篇: 基础--String类相关原理讲解