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
异常,而不是显示修改后的结果,这样可以避免共享资源而引发的潜在问题。