为什么不能在增强for循环和迭代过程中通过list本身进行添加/删除操作

1.在增强for循环中除元素:

结果:

2.在迭代过程中通过list本身删除:

结果:

 

3.原因:

1实际原因:ArrayList源代码中有这么一个方法:在迭代器的hasNext()、next()方法都会被调用。作用是判断list的大小有没有变化,如果变了,就抛异常。也就是说,源代码就规定了不能在迭代过程中通过List本身进行添加/删除操作。

2根本原因(个人理解):list.remove(s):通过数组遍历,找到s将其删除,然后把后面的元素前移,size-1

 

iterator.remove():原理一样,但是iterator.hasNext()判断的是有没有下一个元素,cursor指向的是下一个元素的索引。

 

 

所以,在迭代过程中通过list本身添加/删除元素,由于没有改变cursor的值,假如cursor指向最后一个元素,那么list.remove(*)之后,cursor指向的元素前移了,但是cursor不知道呀,再迭代就会出错;同理,添加元素的话,cursor本来指向null,现在实际上是一个新的元素,cursor也不知道。所以,干脆禁止在迭代过程中通过List本身进行添加/删除操作。

 

 

posted @ 2018-05-16 14:56  喝醉的香锅锅  阅读(771)  评论(0编辑  收藏  举报