list在遍历过程中的add/remove

Posted Lucia557

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了list在遍历过程中的add/remove相关的知识,希望对你有一定的参考价值。

平时开发过程中,很多人估计都遇到过一个问题:在遍历集合的的过程中,进行add或者remove操作的时候,会出现2类错误,包括:
java.util.ConcurrentModificationException for in遍历过程中add/remove导致的错误
java.lang.IndexOutOfBoundsException 越界错误,for循环的时候删除元素。

那么我们应该怎样避免这个问题呢?

首先对于add操作:建议利用原生的for循环。remove操作利用foreach操作

具体代码如下:remove

add:

经典错误1:

什么错误呢?这段代码用于只会输出list的第一个元素。问题出在链式写法上。

每次循环时候先调用了list.iterator() 在该方法中每次都是重新new了一个新的对象
public Iterator<E> iterator() {
return new Itr();
}
所以每一次都是一个新的遍历对象,所以输出第一个元素。
那么为什么每次都要new一个新的Itr()?我猜想应该是为了并发的读,每次读的都是一份独立的数据,避免多个并发读的时候,出现当前指针问题。
处理办法:将list.iteraotr() 放在外面即可,保证循环中循环的是1个对象。

 经典错误2:

会陷入死循环

 

以上是关于list在遍历过程中的add/remove的主要内容,如果未能解决你的问题,请参考以下文章

怎么遍历ArrayList中的list呢?

正确遍历删除List中的元素

遍历std::list过程中删除元素后继续遍历过程

遍历list进行remove操作异常

对List遍历过程中添加和删除的思考

循环遍历所有 SSMS 数据库而不重新创建存储过程