前言:
而今姐妹们对“for循环直接删除arraylist”大概比较重视,小伙伴们都需要分析一些“for循环直接删除arraylist”的相关资讯。那么小编在网络上网罗了一些对于“for循环直接删除arraylist””的相关知识,希望同学们能喜欢,兄弟们快快来学习一下吧!经常会有人这么对 list 进行遍历,错而不自知。
示例代码如下:
以上代码执行导致的报错信息如下
网上有很多博客对此都做了说明,这篇文章通过比较浅显易懂的方式说明报错产生的原因。
一、list.add
在 list.add 代码执行时,有一个变量发生改变了,那就是 modCount。在代码中 list.add 共执行4次,所以 modCount 的值为 4。
注:list 的 add()、remove() 和 clear() 都会改变 modCount 值。
二、for (String str : list)
for (String str : list) 调用的是 ArrayList 中内部类 Itr,Itr 是对 Iterator 的实现。而在 Iterator 开始前,会先执行 int expectedModCount = modCount
此时 expectedModCount 和 modCount 均为 4
三、list.remove("aaa")
在此处先看一下会报错的原因,以下是源码:
即 modCount 与 expectedModCount 不相等了,所以报错。
有人可能会跟我有一样的想法,为什么 list.remove("aaa") 时,不把 expectedModCount = modCount 重新赋值一次。其实是有的,只是调用的方法错了。
例子中 list.remove("aaa") 调用的 remove 源码如下:
而使 modCount 的值改变的是其中的 fastRemove 方法。
fastRemove 源码如下:
而真正使 expectedModCount = modCount 执行的源码如下
此代码在内部类 Itr 中。
这也就是为什么会说,如果 list 在循环中有删除操作,最好用 iterator 迭代的方式去做。
四、总结
简单总结一下
list.remove() 没有对 expectedModCount 重新赋值iterator.remove() 对 expectedModCount 重新赋值
建议大家跟踪一下源代码,代码量不多,也很容易理解。
作者:饭娱咖啡
来源:开发者社区
标签: #for循环直接删除arraylist