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