8.2.2 使用Java8增强的Iterator遍历集合元素
8.2.2 使用Java 8增强的Iterator遍历集合元素
Iterator接口和Collection接口Map接口的区别
Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样:
Collection系列集合、Map系列集合主要用于盛装其他对象,Iterator对象也被称为迭代器,Iterator主要用于遍历(即迭代访问)Collection集合中的元素。
Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口。
Iterator接口方法
Iterator接口里定义了如下4个方法
| Iterator接口方法 | 描述 |
|---|---|
boolean hasNext() |
如果被迭代的集合元素还没有被遍历完,则返回true |
Object next() |
返回集合里的下一个元素 |
void remove() |
删除集合里上一次next方法返回的元素 |
void forEachRemaining(Consumer action) |
这是Java 8为Iterator新增的默认方法,该方法可使用Lambda表达式来遍历集合元素 |
程序 通过Iterator接口来遍历集合元素
下面程序示范了通过Iterator接口来遍历集合元素。
1 | import java.util.*; |
运行效果:
1 | 疯狂Android讲义 |
Iterator仅用于遍历集合
从上面代码中可以看出, Iterator仅用于遍历集合, Iterator本身并不提供盛装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。
Iterator必须依附于Collection对象
Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的Collection对象。 Iterator提供了两个方法来迭代访问Collection集合里的元素,并可通过remove()方法来删除集合中上一次next()方法返回的集合元素。
修改迭代变量的值对集合元素本身没有任何影响
当使用Iterator对集合元素进行迭代时, Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。
Iterator迭代时不可修改Collection集合里的元素
当使用Iterator迭代访问Collection集合元素时:
- 不可以通过
集合对象修改Collection集合里的元素,- 例如:不能通过集合对象来添加元素(不可以c.add(e)),也不能通过集合对象来移除元素(不可以c.remove(e))。
- 如果一定要在迭代时删除元素,只有通过Iterator对象的remove方法才可以删除
next()方法返回的集合元素.- 否则将会引发
java.util.ConcurrentModificationException异常。
- 否则将会引发
程序 使用Iterator迭代过程中 不可以通过 集合对象 来修改集合
下面程序示范了这一点。
1 | import java.util.*; |
运行效果:
1 | 1 |
上面程序中collection.remove(book);这行代码位于Iterator迭代块内,也就是在Iterator迭代Collection集合过程中修改了Collection集合,所以程序将在运行时引发异常。
Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中的其他线程修改),程序立即引发ConcurrentModificationException异常,而不是显示修改后的结果,这样可以避免共享资源而引发的潜在问题。