![d11411df22d0d1b61f48970c884b9df4.png](https://img-blog.csdnimg.cn/img_convert/d11411df22d0d1b61f48970c884b9df4.png)
Sourced from
Data Structures and Algorithms in Java, 6th Editionlearning.oreilly.com![5ddd94135e9315deb7b87ee41ccd8a3b.png](https://img-blog.csdnimg.cn/img_convert/5ddd94135e9315deb7b87ee41ccd8a3b.png)
迭代器是一种scanning through一系列元素,每次一个的一种软件设计模式。底层的迭代元素可能是被一个容器类所存储,也有可能是经过一系列的运算生成的。
Java针对迭代器定义了java.util.iterator
接口,定义有如下2个方法:
![41fd86f636dc4e2d7b4c27ec58dd271b.png](https://img-blog.csdnimg.cn/img_convert/41fd86f636dc4e2d7b4c27ec58dd271b.png)
这个接口使用了java的泛型变成,next
方法会返回一个参数化的元素。 如果next
方法在容器中没有元素 再被调用,会报一个NoSuchElementException
的错。所以我们需要hasNext
方法来帮忙做预判。一个典型的使用代码块如下:
while(iter.hasNext()){
String value = iter.next();
System,out.println(value);
}
当然java.util.Iterator
接口包含第三个方法(但需要注意下图的方法 不是所有迭代器都支持的)。
![3fe8aa9166781772c4fe473585d0ae04.png](https://img-blog.csdnimg.cn/img_convert/3fe8aa9166781772c4fe473585d0ae04.png)
remove
方法可以帮助对一系列collections元素进行筛选(比如丢弃所有的负数)
迭代接口Iterable以及Java的For Each Loop
一个迭代器只能迭代单个Collections一次,直到next
方法对所有元素都进行了遍历,但迭代器本身是没有重置
这个功能的。
如果我们想要通过迭代器反复遍历一个collections的话,我们可以尝试不停的声明new iterator
来达到目的。为了更好的标准化,java也对于可迭代对象iterable
也定义了如下的方法来直接生成一个迭代器。
![1f690757e13d5be20fd5bd2a7fe10b3c.png](https://img-blog.csdnimg.cn/img_convert/1f690757e13d5be20fd5bd2a7fe10b3c.png)
一个典型的可迭代对象就是java.util
中的ArrayList
,当我们调用iterator
方法时,它就会返回一个新的迭代器对象(这样其实就可以同时遍历同一个collections)
Java的Iterable
类也