Java容器类迭代器的细节

107 阅读2分钟

前言

从上篇文章《从源码看ArrayList与Vector》我们看到有关容器类的各种增删操作,都会用到modCount++来做记录,那么到底这个变量有什么用呢,我们来看一下有关的源码。

引出

在编码过程中,我们常常遇到这样的需求,从一个容器中筛选出不符合类型的数据,然后剔除。一些初学者可能就容易写出这样的代码:

然后就报错了

原因

原因就跟modCount这个变量有关,我们都知道java的foreach其实是语法糖,在底层编译的时候实际是采用的迭代器

然后我们看下迭代器的源码,以ArrayList的源码为例

当创建迭代器的时候,迭代器会维护一个expectedModCount变量, 有点儿像设置了版本号,然后在进行遍历的时候,每次next都会检查“版本”是否保持一致,而之前一篇文章也说到,容器类中的增删方法都会对modCount这个进行++

add:

remove:

于是,当使用for(Integer num: arrayList)这样的语法糖的时候,其实是使用迭代器,而当使用迭代器进行遍历的时候,是不能操作容器类的增删方法的,如add、remove。

解决方案

既然上面使用迭代器会出问题,那我们不用迭代器不就行了吗,所以就有这样简单的做法

但其实迭代器中就已经有了这样的方法

所以使用迭代器的话可以这样,不用foreach语法

结语

然而我看生产环境很多都是foreach,然后另外new一个数组,然后把符合的装进另外的数组中。。。不管怎样都是可行的方案吧,看具体情景具体分析,记录下来主要是看看源码学习学习[呲牙]。